你真的能使用GoF设计模式构建一个快速的文字处理器吗?

7

四人帮的设计模式以文字处理器为例,至少在几个模式中,特别是组合模式和享元模式。

除了使用C或C++之外,您真的可以使用这些模式和它们所涉及的面向对象开销来编写高性能的功能齐全的文字处理器吗?

我知道Eclipse是用Java编写的,但我没有多少使用过它,所以我不知道它是否像Visual Studio那样快速或像基于C++的文本编辑系统那样精细。


我只是以C++和Java为例。这个问题更多的与内存中有很多对象的开销有关,比如像文字处理器或游戏这样的应用程序。
设计模式促进抽象,但通常会指出何时可能会受到某种性能影响,尽管这会牺牲简洁性。文字处理器和尤其是游戏从尽可能接近底层获得最大的好处。
我只是想知道是否有任何快速的面向对象的文字处理器或文本编辑器不是用C++编写的,以及他们是否会使用设计模式来构建它们,或者是否会放弃许多事物的抽象化?

1
在一个3+Ghz 4核8线程处理器已经成为商品的世界里,如果你定义“快速”,我向你挑战,让你写一个慢的文字处理器。 - user177800
2
@fuzzy:我几乎同意你的观点,但是我有一台8核i7处理器、12GB内存的电脑,即使是写得很糟糕的商业软件仍然会变得运行缓慢。 - Stephen Canon
1
@fuzzy,如果没有指定任何约束条件,那将是一个愚蠢的挑战。 - Mark Cidade
Visual Studio 2010在WPF中实现了基于C#的文本编辑器,这是其中的一项重大变化。 - luke
7个回答

6

Flyweight模式通常用于在具有共享内在状态的数千个对象的情况下保留资源,因此它可能适用于比C/C++更高级别的语言。也许GoF在文档中使用字形作为示例并不是说明这种模式的最佳选择。

我认为构建高性能的文字处理器还需要更多基本模式之外的东西,不确定GoF中是否有任何规则可以成功地做到这一点。

总的来说,Visual Studio(VS)比Eclipse更先进且性能显着更好 - 至少在我所见过的版本中是如此。然而,Eclipse是最令人印象深刻的Java应用程序之一,它在具有大量RAM的较新机器上运行得非常好。


实际上,它是GoF缩写,而不是GOF。 - Burkhard
Eclipse在启动时加载的插件越多,内存开销就越大。不幸的是(或者幸运的是,这取决于你的观点),越来越晚的Eclipse版本默认包含越来越多的插件,增加了开销,但也增加了功能。 - MetroidFan2002
2
通常,Visual Studio(VS)比Eclipse更先进且性能显着更好。 - Dónal

3

嗯,享元模式在文字处理器中使用是荒谬的模式。如果我没记错,他们将每个字符都被引用为一个对象[note: 实际上是每个字形,但这仍然很疯狂,因为你的操作系统会愉快地为你绘制它]。由于指针比字符宽且与间接引用相关的所有处理,您会发疯地使用该特定模式来处理文字。

如果您对文字处理器的设计感兴趣,我找到了一篇文章,虽然没有涉及模式,但确实考虑了一些文字处理器设计和设计考虑的底层数据结构

请记住,设计模式存在是为了让您的生活更轻松,而不是为了纯粹。必须有使用模式的原因,它必须提供某些好处。


也许直接绘制单个字形而不是委托给操作系统可能听起来有些疯狂,但许多文本查看器和编辑器都更喜欢这样做。操作系统的字形渲染例程可能会产生不太美观的结果。 - Vlad Gudim
不知道原始链接是否指向此处,但我能找到的最好的链接是:http://www.cs.unm.edu/~crowley/papers/sds/sds.html。 - Robert Groves
@ChristofSchardt:我认为现在它在这里:http://www.bluemug.org/research/text.pdf - Paul D. Waite

2
GoF和模式的目的是讨论如何正确地做事,而不仅仅是在特定情况下做正确的事。当性能成为问题时,如果你发现没有任何命名模式可以提供足够的性能,那么也许你可以证明自己的方法是合理的。但是对模式的良好了解会给你提供一个“明智的默认值”,并且可能意味着你只需要牺牲适当的性能来保持清晰度/SoC等。
感觉你正在“偏离”常规会鼓励你a)三思而后行,b)注释非习惯用语的代码。
模式是重要的知识,但没有什么是绝对的,你必须始终运用判断力。
话虽如此 - 我想不出任何理由,为什么你不能使用模式和现代JDK编写一个体面的文本编辑器。

0

是的,现在的计算机速度足够快,内存足够大,这是可能的。如果你看看Squeak,你会看到一个用Smalltalk编写的Smalltalk IDE,比Java慢得多,但仍然足够快。另一方面,高清视频编辑目前需要一些低级别的支持。


0

如果你正在编写文字处理器或集成开发环境,则该论文的基准测试大多是不相关的。 - Daniel James

0
你必须记住的一件事是,GoF书是在90年代初期编写的,当时普遍的操作系统没有广泛的图形库。即使在那个时候,Windows也还不是一个操作系统。
据我所知,GoF是在1994年发布的。即使在1994年,Windows 95 Beta也已经可用(并且可以在我的486DX33上运行),而Windows 3.x大约从1990年左右开始流行。

0

Eclipse、NetBeans和IntelliJ都是用Java或者运行在JVM上的语言编写的,而不是C++。我花了一些时间研究这些IDE中至少两个的编辑器代码,所以我可以向您保证它们都是用Java编写的(而且并不容易)。

我的最后一次使用Visual Studio是在2005年,即使那时我也认为Eclipse更加响应迅速(IntelliJ更是如此,只要给它足够的时间来预热和索引)。

虽然我不确定这与本文有何关联,但这就是我的经验。但我很惊讶地发现,Visual Studio今天仍然是用C++编写的——我认为微软使用C#会更符合他们的利益——如果没有其他原因,它也会真正推动其性能,毕竟自己吃自己的狗粮才是王道!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接