2010-09-19 91 views
10

从大学毕业后,我一直在为大约3-4个月的时间进行程序设计(作为一项工作)。走出程序心态

在大学时我被教过面向对象的编程,我觉得我对此有很好的把握,直到我开始研究真正的问题。

我只是不能做任何事情,但想出解决方案的程序代码 - 虽然我使用类和基本的操作系统代码基本上是程序内部,我知道有更好的解决方案,但我似乎不能匹配模式等等与我想要做的事情。

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

此外,是否有任何建议,以便如何真正地设计解决方案正确的解决方案进展?

+0

看看Effective Java by Joshua Bloch,第二版,Implementation Patterns byKent Beck。 – zellus 2010-09-19 20:40:28

+0

@zellus:为什么不作为回答发布? – SingleNegationElimination 2010-09-19 20:41:33

+1

@TokenMacGuy:刚想过答案的信息太少。 – zellus 2010-09-19 20:53:45

回答

3

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

但是,如果这不足以让你滚动,也许你需要的是一些更多的工具在你的腰带下工作。一个广为接受的来源是GOF book,它详细地描述了构建程序的一些方法,重点是OOP。不过,谨慎的说法是,确保你应用的任何模式都非常适合这个问题,因为如果你随意应用它们,它会导致你和你的同事们头痛不已。

+0

+1,我希望我能给你+1这个答案中的每一个重点。 – 2010-09-20 15:55:02

0

除了@ TokenMacGuy的回复,在设计课程时有一个有用的指导方针 - 他们应该知道怎么不知道什么。例如,在一个为某些目的使用位置的系统中,应该知道如何找到他们的位置,而不是存储它并记录它。虽然不是灵丹妙药,但要记住它是非常有用的,因为它有助于使你的思维朝着适当的方向发展。

1

我认为在你的情况下,你应该尽可能的开始编码,甚至是程序。完成后,代码运行,研究它,看看如何将它分解成模块。找到应该放置在对象方法中的通用功能。同时,尝试看看如何重构代码以适应您阅读的模式。及时,你会打开你在你的设计中做错了什么,并提高自己

1

看着Numerical Recipes in C你会体验过程式编程。带有无限参数列表的函数调用,程序流控制遍布许多过程。采用一种简单的算法,如“Runke-Kutta”,并将其移植到您选择的OOP语言。封装和消息传递是一种完全不同的思维模式。

OOP 建模,正如TokenMacGuy已经说过的那样,“真实世界对象的相互作用”。程序编程更多地关注“算法”。

学习OOP的一个步骤是将真实世界对象转换/模型化为类属性和方法的能力。 Books Effective JavaImplementation PatternsGoF帮助您在将真实世界对象放入代码时选择最佳实践。

+0

NR的第三个版本(你**必须**,前一个是15岁)使用C++和良好的OOP设计。 – 2010-09-19 21:47:54

+0

@Alexandre C.我故意选择了15年前的c版本。我认为提问者学习了一种OOP语言,因为他是第一种编程语言。因此,他可能没有将经历从程序转移到面向对象。这并不是我的意图,根本就不讨论数字食谱的C版本。 – zellus 2010-09-19 22:02:07

11

我认为这只是需要很多练习。

有人在这里说: OOP是建模真实世界的对象。但这也是他们通常在学校告诉你的,正如我从OP那里了解到的那样,它确实没有那么有用。

当我看着我的代码时,我发现它完全没有任何真实世界表示的对象:数据库映射器,对象工厂,表达式构建器等等。它们可能听起来像真实世界的对象,但它们确实是真的什么都不像。它们只是帮助我们管理程序的整个复杂性的抽象概念。

我认为OOP的主要困难部分正是如此。你不能只看看你的问题领域,例如处理汽车,并说:我知道,我需要一个汽车类!即使您确实需要Car类,这些知识也无助于您决定真正放入其中的内容。显然,你不能仅仅把那些在汽车内部处理过的数十万个功能放在一个类中。那么你如何管理它?如何切片? Car类应该负责什么?谁还应该了解汽车类?这些是难以解决的问题,除了程序的作者本人可以真正回答的问题外,没有人会问。即使是最有经验的人也很难在第一时间回答所有问题。

但我想有一些一般的良好的面向对象原则要遵循。保持尽可能低的物体之间的coupling。按照the law of demeter。请牢记SOLID原则。但最重要的是:一直保持DRY

此外:不要局限于面向对象的方法。学习函数式编程,正则表达式,编译器构造,汇编语言以及您可以管理的许多不同的高级语言 - 仅仅了解OOP并不会让您成为一名优秀的程序员,但研究所有这些不同的方法和工具将允许你可以更加清晰地看待OOP,从而更深入地理解这个OOP事物的真正含义。

+0

+1专门用于回答“但这正是他们通常在学校告诉你的,”我在阅读现在最高票率问题的第一段时正在考虑wtf(http://stackoverflow.com/questions/3747352 /获取-外的一个程序性,思维/ 3747393#3747393)。真的,这是他们告诉你的第一件事。正如你从我的回答中可以看出的那样,我会在你的最后一段中特别提到SOLID。 – eglasius 2010-09-20 05:31:16

0

里用C实现COM对象,你就会明白

顺便说OOP和程序之间的区别......,研究对象模型(COM例如,但这是1995年如此......)是掌握面向对象模块化的优越性的好方法。带上你最喜欢的大型图书馆(如果你使用C++或python,Qt是一个好的开始),并阅读文档,编写小程序。

3

我只是不能似乎做什么,但拿出解决办法的程序代码 - 虽然我使用类和基本的OOP技术的代码基本上是程序里面,我知道有更好的解决方案,但我不能似乎匹配模式等与我想要做的事情。

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

在使用oop技术真正开始编程之前,需要多长时间/多少时间才能开始编程 - 与使用充满程序代码的类相反。

取决于你的意思是否正确。你可能很早就学会了应用特定的方法,甚至可以实现一些非常酷的事情,但是要真正掌握它需要几年的时间。我只是觉得有一些难题需要花费很长时间才能真正沉入其中。

另外,有没有关于如何真正地设计解决方案以正确解决问题的建议?

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