走出程序化的思维模式

时间:2010-09-19 20:30:50

标签: design-patterns oop

从大学毕业后开始学习计算,我已经编程(作为一份工作)大约3-4个月了。

在大学时,我被教授面向对象的编程,在我开始研究真正的问题之前,我觉得自己已经很好地掌握了这一点。

我似乎无法做任何事情,只是想出解决方案的程序代码 - 虽然我使用的是类和基本的oop技术,代码本质上是程序性的,我知道有更好的解决方案,但我似乎无法匹配模式等我正在尝试做什么。

在使用oop技术真正开始编程之前需要花多长时间/多练习 - 而不是只使用充满过程代码的类。

此外,对于能够正确设计问题解决方案的真正进展有什么建议吗?

7 个答案:

答案 0 :(得分:11)

我认为这需要很多练习。

这里的一些人说: OOP正在为现实世界的物体建模。但这也是他们在学校通常告诉你的,正如我从OP中所理解的那样,它确实没那么有用。

当我查看我的代码时,我发现它已经被各种绝对没有现实世界表示的对象所淹没:数据库映射器,对象工厂,表达式构建器等。它们可能听起来像真实世界的对象,但它们真的没什么喜欢。它们只是抽象,可以帮助我们管理整个程序的复杂性。

我认为OOP的主要难点就在于此。你不能只看你的问题领域,例如处理汽车并说:我知道,我需要一个汽车课!即使你确实需要一个Car类,这些知识也无法帮助你决定真正放入它的内容。显然,你不能只把所有涉及汽车的十万个功能放在一个类中。那么你如何管理呢?如何切片?汽车课应该承担什么责任?谁也应该了解汽车类?这些是难以解决的问题,除了程序的作者本人之外,没有人可以真正回答这些问题。即使是经验最丰富的人也很少在第一时间回答所有问题。

但我想有一些一般好的OOP原则可以遵循。保持对象之间的coupling尽可能低。关注the law of demeterSOLID原则很好记住。但最重要的是:一直保持DRY

此外:不要局限于面向对象的方法。研究函数式编程,正则表达式,编译器构造,汇编语言,以及尽可能多的不同高级语言 - 单独了解OOP并不能使您成为一名优秀的程序员,但研究所有这些不同的方法和工具将允许你可以从更加截然不同的角度看待OOP,让我们更深入地了解这个OOP真正的内容。

答案 1 :(得分:3)

程序不是客观上比面向对象设计更糟糕,但它是一个方便的工具。让OOP运行良好的核心方法是将您的程序视为对现实世界对象的交互进行建模,每个现实世界对象都由程序对象建模,并且这些对象之间的每个交互都是一种方法。

但是,如果这还不足以让你滚动,也许你需要的是一些更多的工具可供你使用。一个广泛推荐的来源是GOF book,它详细描述了许多构建程序的方法,重点是OOP。但要注意的是,确保你应用的任何模式都适合这个问题,因为如果你随意应用它们会导致你和你的同事无休止的头痛。

答案 2 :(得分:3)

  

我似乎无法做任何事情,只是想出解决方案的程序代码 - 虽然我使用的是类和基本的oop技术,代码本质上是程序性的,我知道有更好的解决方案,但我似乎无法匹配模式等我正在尝试做什么。

不要绝望,一开始就完全正常。在处理它时要小心你所做的事情,确保你只应用模式来解决你在代码中看到的实际问题。代码应该很简单,您可能有一个不需要任何高级技术的场景。无论你学习什么,都要记住你想要的是引入简单的元素,这些元素会给你带来优势,而不会以一堆不必要的代码/模式结束。

  

在使用oop技术真正开始编程之前需要花多长时间/多练习 - 而不是只使用充满过程代码的类。

取决于你的意思。您可以学习很早就应用特定方法, 甚至实现一些非常冷却的东西,但imho真正掌握它需要数年。我只是觉得这些拼图中有很多东西可以让你真正陷入其中。

  

此外,对于能够正确设计问题解决方案的真正进展有什么建议吗?

我强烈建议您阅读这两本“电子书”S.O.L.I.D. principles and 31 Days of Refactoring。 SOLID上的那个在代码的设计方面非常好,特别是在敏捷环境中。重构问题可以帮助您识别现有代码中的改进机会。

答案 3 :(得分:1)

我认为在你的情况下,你应该尽可能地开始编码,甚至是程序性的。完成后,代码可以运行,研究它,看看如何将其分解为模块。查找应放在object方法中的常用功能。同时,尝试了解如何重构代码以适合您阅读的模式。随着时间的推移,你将看不出你在设计中做错了什么并改善自己

答案 4 :(得分:1)

查看Numerical Recipes in C您将体验到程序编程。具有无限参数列表的函数调用,程序流控制遍布许多过程。采用像'Runke-Kutta'这样的简单算法,将其移植到您选择的OOP语言中。封装和消息传递是一种完全不同的心态。

OOP 建模,正如TokenMacGuy已经说过的那样,“真实世界对象的交互”。程序编程更侧重于“算法”。

学习OOP的一个步骤是将现实世界对象转换/建模为类属性和方法的能力。诸如 Effective Java Implementation Patterns GoF 等书籍可帮助您在将现实世界对象放入代码时选择最佳实践。

答案 5 :(得分:0)

除了@TokenMacGuy的回复之外,在设计课程时还有一个有用的指导原则 - 他们应该知道怎么不知道什么。例如,在为某些目的使用位置的系统中,类应该知道如何找出它们的位置而不是存储它并记录它。虽然不是灵丹妙药,但要记住它是非常有用的,因为它有助于将你的思想放在合适的方向。

答案 6 :(得分:0)

在C中实现COM对象,你就会理解OOP和程序之间的区别......

顺便说一句,研究对象模型(例如COM,但这是1995年......)是一种很好的方法来掌握OOP在模块化方面的优越性。拿你最喜欢的大型图书馆(Qt是一个很好的开始,如果你是C ++或python),阅读文档,编写小程序。