无法掌握编程设计模式


16

在过去的4年中,我一直在使用javascript。我对解决问题的能力非常有信心,并且可以看到我的代码质量正在提高。我尝试与社区保持同步,目前正在使用ES2015和React.js。但是,我觉得我根本无法掌握编程设计模式。我知道在哪里可以找到有关此资源的信息,并且我已经阅读了有关它的书籍。我依靠我的高级同事来制定项目结构的决策,但是我对此工作没有任何疑问。

每当我需要自己开始做某事时,我都会寻找这两个路径:如果我使用的是像React.js这样的大型库/框架,我倾向于复制社区正在做的事情;如果使用较小的模块,则将使用模块模式。我知道,一旦我对这个问题有了更好的理解,我就能做出更好的决定,但是现在我已经完全迷失了。

我应该为此寻求高级教育吗?我需要这个主题的导师吗?我只是愚蠢吗?这真的很难理解吗?


6
我认为,在使用设计模式的必要性方面,某些语言比其他语言更“宽容”。强类型的编译语言(例如Java和C#)比弱类型的脚本语言(例如JavaScript和PHP)受不良设计的影响更大。当然,并不是说设计模式对两者都没有用。
马修

3
项目规模也起着重要作用。
马修

2
@Matthew nitpick我不一定会称Java / C#为类型...
Jared Smith,

2
@JaredSmith是的,我经常忘记强类型和静态类型之间的区别。
马修

6
如果您通常想了解样式,请停止!那里什么都没有!模式是解决常见问题的一种流行解决方案,有人给它起了个名字。这里的所有都是它的。您可能会发现很难掌握某些特定的模式-我本人想起如何有效地使用“ visitor”模式来模仿Java中的双调度,但我很难解决-但是,如果您正在寻找链接“ visitor”的秘密武器要说“数据传输对象”,您将找不到它。它们只是对两个常见问题的两种流行解决方案,有人给了他们名字,而名字却卡住了。
所罗门慢速

Answers:


34

软件设计模式是解决已知问题的众所周知的解决方案。 了解它们的方式是通过学习模式,了解它们的工作原理以及知道何时将它们应用于您的软件设计中。

学习软件设计模式的方法是一次学习一次。这是一个持续的教育过程。如果您想减少学习足迹,请研究与您当前使用的技术直接相关的那些模式。

有关设计模式的一些重要事项:

  1. 一些设计模式本质上建筑性的。 MVC和MVVM是此类模式的示例。当您需要它们提供的组织和结构效益时,可以使用这种模式。

  2. 一些设计模式是解决编程语言缺陷的方法。 如果您使用更具表现力的编程语言,则不需要这些模式,但是通常您不会做出这种选择。大多数GoF模式属于此类

  3. 仅在尝试解决该模式专用解决的问题时,才使用软件模式 如果您通过将软件模式组合在一起来编写应用程序,那么您做错了。

  4. 没有针对每个计算问题的现有软件模式。在这种情况下,编程仅是模式匹配练习。

  5. 一些模式实际上是反模式。 这些模式带来的额外复杂性超过了它们提供的好处。您必须根据每个模式自行决定要避免使用哪种模式。


好的答案,尽管我不同意大多数GoF模式是针对编程语言缺陷的解决方法的说法。通常,某些模式更适合某些语言,是的,因为在设计语言时往往会考虑某些问题和解决方案。
Polygnome

1
Gof模式已有20年历史了。 它们中的大多数是为了解决C ++的问题而创建的,C ++是Java继承的问题,因为Java基于C ++。
罗伯特·哈维

这个答案中的悖论是“众所周知的问题”部分。如果您从未经历过这些“众所周知的问题”,则很难理解。
Fuhrmanator

2
Java 不是基于C ++。Java类的语法启发由C ++,但它肯定不是基于它。两种语言的工作方式完全不同。由于Java abstact硬件通过不具有模板而是由泛型等自身来管理内存的事实
Polygnome

4

每个人的学习方法都略有不同,我不知道您的一般方法是什么,但是我相信您将自己标记为“愚蠢”会给自己造成伤害。

就我个人而言,根据我对许多所谓的“成功”软件工程师,设计师等的观察,他们的学习都有一个共同的主题:“经验”。我相信这是您的“高级教育”,与从亚马逊上购买大量书籍并阅读它们相比,这将比从中学习更快(这是我的一个坏习惯)。

因此,例如,采用GOF模式(如命令模式)并以您选择的语言实现它。了解它给您带来什么好处和缺点。有关设计模式的各种书籍将向您解释这一点,但我认为最好将这些知识实际应用并从中学习。不要打折阅读材料,它们是有目的的,但是IT领域几乎不是教科书。话虽如此,这是我对IT世界的看法和看法,在某种程度上代表了我在软件工程职业生涯中的奋斗历程。而且,即使对于非常有经验的软件开发人员来说,我看到的一个主要问题是耐心和忘记享受他们所做的事情。因此,花点时间学习自己的知识,并记住要真正享受所做的事情,否则为什么要花时间在上面呢?

另外,要利用他人的实践经验。有很多开源解决方案,无论是好的还是坏的,您都可以从中学习。查看他们如何应用模式,并思考如何以不同的方式解决它。

因此,我的一般建议是,如果您认为自己的方法是错误的,请进行更改。看一下您周围的人,他们正在学习您觉得自己没有掌握的材料,看看他们在做什么,甚至问他们。


1
我真的认为编程就像下棋游戏。您可能会拥有一些本机天赋,您可能会整天玩游戏,但是如果您不阅读有关国际象棋的书籍,您将无法取得任何进步,更重要的是您将无法欣赏游戏的美感。
阿德里安·伊夫托德

@AdrianIftode-同意。如前所述,我不会打折书籍,博客或任何阅读材料,但这是我发现的一个普遍问题,因为人们努力地精通编程语言/平台/框架等,似乎他们几乎没有编写代码和/或实践努力,但已经读完了所有可以动摇的书。
荒凉星球

@AdrianIftode好吧,不完全是。下棋而无需看书,您仍然可以学到很多有关游戏的知识。唯一的区别是,您不能通过借鉴一些象棋大师的经验和思想来尽可能快地学习。另一方面,通过对某些事情进行自我思考,您可能会偶然发现一两个解决方案,而这些解决方案被仅向国际象棋大师学习的人们完全忽略了,并且您可能会利用这些解决方案来发挥自己的优势。最后,我相信两种学习方式的结合会带来最大的好处。在国际象棋以及编程中。
cmaster-恢复莫妮卡

1

简短的答案是您不需要它们。您可以在没有它们的情况下编写代码。正如Matthew在评论中所说的那样,这在JavaScript中尤其如此,因为JavaScript的语言非常灵活并且项目往往较小。但是,如果您已经编程了4年,我很难相信您还没有偶然发现那些让人感到重复或尴尬的东西。您正在重新发现或缺少设计模式的那些区域。

示例:JavaScript的事件系统通常不足以处理手头的任务。您是否从未发现自己想要组合或转换事件?还是那一系列事件本身就是一流的价值?您需要中介者和/或观察者模式。需要2路数据绑定吗?相同的故事。

脆弱的原型层次结构陷入困境?Mixin / Trait / Subclass工厂模式可以进行救援。


4
在不使用任何设计模式的情况下,编写任何平凡的程序几乎是不可能的,通常,您还将使用许多常见的程序。您不需要的是能够按名称识别正在使用的模式。即使您不能命名整个代码中使用的所有设计模式,也可以编写工作代码。
2013年

@Servy设计模式是抽象的,抽象不是严格必需的。您总是可以一次又一次地写出一个临时的基础行为实现。例如,在我提供的事件示例中,可以手动连接所有相关方,然后在每次需求更改时都将其全部更改,与使用pub / sub相比,这很糟糕。对于子类,可能的话(如果很浪费),用一堆一次性的类手动编写各种可能性的代码,那不是那么好。
贾里德·史密斯

1
设计模式可以变得非常广泛。通常,更广泛的设计模式是如此明显,以至于我们甚至都不认为它们是设计模式(尤其是当它们具有特殊语言支持时)。循环是一种设计模式。功能是一种设计模式。对象是一种设计模式。
2013年

@Servy,如果这就是您使用该术语的方式,那么我不会不同意,但是我给人的印象是,OP特别是指GOFish模式。
贾里德·史密斯

1
@JaredSmith设计模式不是抽象的。即使您针对您遇到的具体问题一次又一次地实施它们,它们仍然是模式。您无需编写通用的Observer类,就可以使用它来使用Observer模式。编写具体的观察者和具体方法进行注册和通知的方法仍在使用该模式。困难的是要识别模式。有时您在使用某个模式时甚至
都不

1

找一位有很好经验的导师来学习。问他问题,观察他的代码,提交一些代码审查,并尝试与他合作。这是提高您的编码技能的最佳方法。

额外:

  • 与您喜欢的一些简单OSS项目协作

  • 有两种解决同一问题的方法时,请始终选择较简单的方法

  • 在辅助项目上积累一些额外的经验,在这些项目中,您可以自由地进行各种奇怪的错误,并且您将学习“艰难的方式”(tm)的设计模式

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.