但是对于不寻常的问题,肯定有一些不寻常的解决方案,我很想听听。
10 回答
仅崩溃软件: http ://www.usenix.org/events/hotos03/tech/full_papers/candea/candea_html/ 摘要
仅崩溃程序安全崩溃并快速恢复。只有一种方法可以阻止此类软件——通过使其崩溃——并且只有一种方法可以启动它——通过启动恢复。仅崩溃系统是从仅崩溃组件构建的,并且使用透明组件级重试可隐藏最终用户的系统内组件崩溃。在本文中,我们提倡互联网系统的仅崩溃设计,表明它可以导致更可靠、可预测的代码和更快、更有效的恢复。我们提出了有关如何构建这种仅崩溃的 Internet 服务的想法,将成功的技术发挥到逻辑上的极致。
这更像是一种反模式,但我已经看到了我所说的“将所有内容保存在一个地方”模式。这是一个大型应用程序,其中所有非本地变量,对于每个类,每个类,都存储在一个名为 P(用于参数)的类中。顺便说一句,所有静态变量都保存在一个名为...等待它... S 的类中。
无论如何,不知何故,这个项目变得相当大,突然之间,没有任何效果。(我是在这个时候被录用的)。令人惊讶的是,该程序并没有崩溃,它只是有大量的副作用,使应用程序运行起来很糟糕。可以想象,多个线程都访问 P 和修改变量,没有锁定或同步。
我告诉你,这真是一个值得一看的景象。
公司开了一个新办公室,雇了3个人来工作,我就是其中之一。我们得到了程序并被告知要修复它。我们花了几天时间坐在周围只是拍拍我们的额头。我现在脸上有一个永久性的掌纹。
其他有趣的...变量名为“fudgeFactor”。仍然不知道那做了什么。
获取下一个ASCII字符的方法...
char getNextChar(char previous) {
switch (previous)
case 'a': return b;
case 'b': return c;
...
case 'z': return a;
}
不管怎样,这就是我的有趣模式……加上一些额外的有趣之处。
去年我一直在维护一个用 LANSA 编写的 Windows 应用程序,其中焦点是通过将所有控件设置为 tabStop = false 来管理的,除了两个隐藏按钮(PrevFocus 和 NextFocus)。加载表单时,焦点被设置到一个字段,并且该字段的名称存储在跟踪变量中(恰当地命名为“FocusField”)。当用户使用 tabs(或 shift-tabs)改变焦点时,相应按钮的 GotFocus 事件就会运行。该函数内部是一个案例语句(选择案例 FocusField)。根据当前关注的字段,运行验证逻辑,并且可能,焦点更改为另一个字段。
大多数控件的 GotFocus 事件会查看 FocusField 的当前值,然后调用 LostFocus 函数,该函数对 FocusField 执行相同的 case 语句,以便验证先前聚焦的字段。
正如您可能猜到的那样,这使得将 UI 与逻辑分开是不可能的,并且维护起来令人难以置信。重写这些表单以使用简单的 Validate 方法来验证所有输入并让正常的选项卡属性(TabOrder、TabStop 等)发挥它们的魔力通常会导致代码减少 50% 并大大提高表单的可靠性。
我不知道这种模式起源于何处,尽管它可能是由 RPG/绿屏程序员转变为编写应用程序的 WinForms 开发人员的梦想。
访问者第一次在处理大量图形程序时卡住了我,作为对复杂结构进行操作的一种非常优雅的方式。
除了 mvc(它本身不是模式)之外,就其复杂性和解决问题的潜力而言,它是“模式之王”。
Fowler的Fluent Interface是一个非常有趣的模式。我也一直对抽象工厂、策略和状态模式情有独钟。
如果可以的话,我最近编写了一个“模式”,我称之为朋友类模式,有些人可能会觉得它对限制没有 C++ 风格朋友类的语言中私有字段访问器的可见性很有趣或有用。
与其说是一种模式,不如说是依赖注入和控制反转
我记得当我第一次阅读GOF 中的享元模式时。他们使用的例子是文字处理器;他们指出了使用独立对象来表示每个角色的缺点。享元模式鼓励将可共享的、内在的、不可变的状态与不可共享的、外在的、可变的状态分开。对我来说,当时,它是那些“啊哈!”之一。这些时刻真正拓宽了我的视野,并影响了我的设计至今。
我的一个朋友建议策略模式本质上是祖先模式。许多其他模式(桥接、装饰器、代理、状态等)只是策略的更精细应用。我记得我和他争论了很长时间,战略和状态之间确实存在差异。
不,那是关于 DP 书籍的,而这个线程是关于特定模式的。
口译员和享元从 4 本书的帮派中浮现。
我认为 sw 开发人员工具箱中的 Bridge 和 Mediator 是强大而深入的模式。
在我不得不直接使用ASM库操作 Java 字节码之前,我从来没有看到访问者模式的意义。令人惊讶的是,这种模式在多大程度上简化了原本非常复杂的任务。
当您想编写自己的重构插件时,大多数 Java IDE 也使用该模式。您提供一个访问者对象,它会在AST周围传递以进行所需的任何更改。
出于显而易见的原因,您将遇到的最有趣的设计模式是您自己创建的。
这并不是说它将是最好的设计模式,只是最有趣的。