我在使用.net技术进行应用程序开发方面有近6年的经验。多年来我作为一个更好的OO程序员得到了改进,但是当我看到其他人编写的代码(尤其是Jeffrey Richter,Peter Golde,Ayende Rahien,Jeremy Miller等人)时,我觉得我和他们之间有代沟设计。我通常在ReSharper等工具的帮助下动态设计我的类,用于重构和代码组织。
所以,我的问题是“成为更好的OO程序员需要什么”。是吗
a)经验
b)书籍(请参考)
c)过程(tdd或uml)
d)模式
e)其他什么?
如何验证设计是否良好,易于理解和可维护。因为在行业中有如此多的流行语,如依赖注入,IoC,MVC,MVP等,应该更多地集中在设计中。我觉得抽象是关键。还有什么?
答案 0 :(得分:33)
您可能会发现您欣赏的优雅OO设计不是第一次迭代,而是来自多次调整,重构和微调
尝试确定为什么您认为他们的设计比您的“更好”,并相应调整
业余作家和专业作家之间的区别在于专业重写;编程也是如此
答案 1 :(得分:11)
[幽默]
可以从书籍和其他资源中学习面向对象的技能。但如果你幸运的话,你继承了父母的技能。大多数情况下,提供和使用正确的方法是一个问题。注意参数的数量。越少越好。
使用正确的名称。使用动词作为活动方法。将名词用于需要记住的任何事物。不要过于富有创意,尽可能简化您的解决方案,否则您的用户将会成为混淆者。
封装令人讨厌的细节也很重要。并确保为公众隐藏您的私人成员,否则将发生意外行为。还要注意在适当的级别捕捉您的异常情况。
请允许我按下你总是测试你的单位并使用正确的界面为快乐的用户提供足够的句柄。
[/幽默]
答案 2 :(得分:7)
一点点的一切。至于任何语言(口头ou编程),你接触到的越多,你学到的就越多。
所以阅读书籍,阅读你的同事代码。至少同样重要的是,学习新的编程语言:它们将拓宽您的视野,让您对自己的代码更具批评性,并让您重新思考您的编程习惯。
关于设计模式,它们是解决常见语言常见问题的事实上的标准方法。您必须了解它们以避免重新发明轮子并更好地与同事沟通,但您也应该看到它们正在解决您正在使用的语言中缺少的功能。状态机模式仅存在于不将它们作为内置函数提供的语言中(不是我知道提供它们的语言,但是你得到了它)。
我还想补充一下:
答案 3 :(得分:5)
良好的OO设计:
答案 4 :(得分:4)
通过暂时忘记面向对象并使自己定位于编写更清晰,更好的程序,同时改进现有程序,您将成为更好的面向对象程序员。
答案 5 :(得分:4)
第一本书,你需要了解一些GoF模式,但更重要的是你需要了解模式背后的原理。理解旧式(使用继承代码重用)与新风格(更喜欢封装而不是继承)之间的区别oo设计。要阅读的两本好书是由Shalloway和Trott解释的设计模式以及Bob Martin的敏捷软件开发,原理,模式和实践。
然后你需要经验。书中的理论很好,但你需要微调你何时使用什么的感觉。如何使用流程来微调您的设计(Steven A. Lowe已经命名为迭代)许多老式的大师在相同的论文和书籍中描述了迭代编程和oo编程。
最后但我认为最重要的是你需要反馈和沟通。与其他程序员交谈,最好是在你工作的组织之外。尝试与尽可能多的人一起工作(OSS很好)最终你从人而不是书中学习。
答案 6 :(得分:3)
以专用函数编程语言和面向对象语言实践函数式编程。这将增加您对可重用算法如何帮助鼓励定义良好的接口的理解,从而使程序元素更易于使用。
答案 7 :(得分:3)
除了学习书籍和论文等学术内容之外,我高度推荐:学习多种语言,特别是如果你来自Java / C#主流。学习ruby,学习groovy,学习smalltalk,学习lisp,从理论上和实践中学习它们之间的差异。
一个学术但非常好的例子是单个与多个调度:您可以查看wikipedia entry并亲自了解如何根据语言功能编写不同的代码。更重要的是,这有助于您了解如何在保持稳固设计的同时在语言X中实现相同的效果。
这里的关键是试验,理解和发展。您还可以从一些开源项目的阅读或帮助中学到很多东西,它们通常具有良好的架构和实现(至少是大型的)。
答案 8 :(得分:1)
你好,大家好日子
像Cheery所说的那样:“通过暂时忘记面向对象,让自己成为一个更好的面向对象程序员,并在改进现有程序的同时编写更清晰,更好的程序”。这就是关键:思考并尽可能获得最简单的解决方案并编写类似的代码
多数民众赞成 没有...... 再见
答案 9 :(得分:1)
对我有用的东西是阅读。我刚用这本书做了一个Bulb时刻...... David West's Object Thinki ng详细阐述了Alan Kay's comment of 'The object revolution has yet to happen'。 OO对不同的人来说是不同的事情。结合你的工具影响你如何解决问题的事实。所以学习多种语言。
我个人认为理解实践背后的哲学,原则和价值而不是模仿实践有很大帮助。
答案 10 :(得分:1)
什么对我有用:
了解您应用的域名,并尽可能长时间地靠近域名,同时避免代码重复。
不要坚持使用一种语言,学习几种OO语言。 Smalltalk,Comon Lisp,Python,Javascript都有非常有趣的方法来实现OOP。浏览它们的源代码(Smalltalk对象浏览器是一个很好的工具)。
使用没有OOP标准的语言实现OOP库,比如Lua:这将向您显示self/this
只能是指向状态的隐式第一个参数,并委派其行为到class/vtable/metatable
(可以将调用委托给其父class
)。
干杯!
答案 11 :(得分:1)
我认为,对于一个好的OO设计,需要获得正确的心态。
我不确定降级涉及Smalltalk的答案背后的理由是什么,但Smalltalk确实与它有关。关键字是隐喻。对于大多数程序员而言,这实际上是在大多数计算机科学教育中实施的,中心隐喻是机械的:钟表机构或蒸汽机。
最艰难的努力是你需要用另一个隐喻来代替这个隐喻。不是机械的比喻,而是生态系统和生态学的隐喻。如果你已经努力在第一个比喻中获得某种卓越,那么这可能非常困难甚至是痛苦。
Smalltalk中所有这些对象紧密协作的方式遵循这个隐喻。我还发现凯文凯利的书:在这种背景下有趣的失控,因为这本书包含许多基于这个比喻的真实解决方案的例子。
答案 12 :(得分:1)
让某人对您的设计进行审核非常重要。 查看和维护遗留代码有助于您了解导致软件损坏的原因。 思考也很重要;一方面不急于实施第一个想法。另一方面,不要一下子思考一切。迭代地做。
定期阅读Eric Evan的Model Driven Design等书籍/文章,或学习采用不同OO方法的新语言(Smalltalk,Self,Scala),可以帮助您真正理解。
软件和OO完全是关于抽象,责任,依赖和重复(或缺乏)。在旅程中记住它们,你的学习将会稳定。
答案 13 :(得分:0)
3是神奇数字;不亚于此,它无处不在。
通过最小化子类别来减少可能的继承。
通过拥有独立的物体,可能会出现松耦合
坚持下去。
按样品解释。
第一步界面是系统的访问定义。
interface i { getObject($o); }
第二步抽象是对您系统的控制。
abstract class Controller {
function getObject(){}
function validateObject(){
// o must be a digit
// o must be between 0 and 120
// ... etc
}
}
第三步也是最后一步是应该编织和培养可用数据的真实对象。
class View extends Controller (InputObject $in, OutputObject $out) {
}
此具体课程中的可用数据也来自3个方向。
此演示文稿对象将是 - 在网页方面输出结果,页面内容。 - 就MVC而言。 - 就树叶而言。
我建议你多考虑一下这些Triangle套装。 试试例子
答案 14 :(得分:0)
成为更好的OO程序员需要更好的程序员。
多年来,OO一直在不断发展,它与改变范式和技术(如n层架构,垃圾收集,Web服务等)有很大关系。这些都是您已经看过的东西。有一些基本原则,如可维护性,可重用性,低耦合,KISS,DRY,Amdahl定律等,你必须自己学习,阅读,体验和应用它们。 OO本身并不是目的,而是实现编程解决方案的手段。像游戏,体育和艺术一样,没有原则就无法理解实践;没有实践就无法理解原则。更具体地说,这里有一些可以使一个人成为更好的程序员的技能。听取领域专家的意见。知道如何编写测试。知道如何设计GUI桌面软件。知道如何将数据保存到数据库中。单独的UI层和逻辑层。知道如何编写一个类似于内置类的类。知道如何编写一个像内置组件一样的图形组件。知道如何设计客户端/服务器软件。了解网络,安全性,并发性和可靠性。
Design patterns,MVC,UML,Refactoring,TDD等解决了许多问题,通常会以创造性的方式扩展OO。例如,为了将UI层依赖性与逻辑层分离,可以引入接口来包装UI类。从纯面向对象的角度来看,它可能没什么意义,但从UI层和逻辑层分离的角度来看是有意义的。
最后,实现OO的局限性也很重要。在现代应用程序架构中,OO的纯粹数据+逻辑视图并不总是很好地网格化。例如,数据传输对象(Java,MS,Fowler)有意剥离对象的逻辑部分,使其仅携带数据。这样,对象可以将自身转换为二进制数据流或XML / JSON。可以以某种方式在客户端和服务器端处理逻辑部分。
答案 15 :(得分:0)
当我尝试减少类,(java)包和模块之间的依赖关系时,突然开始对我有意义,指定清除模块边界并删除依赖关系中的循环。特别是这种循环移除给我带来了许多见解。您的类/包/模块依赖项理想情况下应该形成一个树。
答案 16 :(得分:0)
得到很好的指导,当你遇到问题时让这些人和你坐在一起并与你一起工作。您可以深入了解他们如何以OO方式思考问题。
定期代码审核。想想我从通过PowerPoint进行的团队代码审查中学到了很多东西,其中一些蔑视倾注在我的代码上。集中精力,确实如此。
当然帮助我在Smalltalk中学习了OO(每个人都应该强迫来做这个恕我直言)。语言总是鼓励“消息发送”的概念。也就是说,不要在这里插入内容,编写一个新方法并调用它(即发送消息并获得答案**)结果?简单,低耦合,高内聚。
**当我用JavaDoc编写一个访问器方法时,我仍然写'回答代表[事物]的[blah]'人们可能认为我很奇怪,但到目前为止没有人称为警察......
答案 17 :(得分:0)
答案 18 :(得分:0)
了解和理解GoF(Gamma等人)的设计模式永远不会错。它们可以应用于很多情况。我想它们对每个开发者来说都是必不可少的东西!