我正在一个大项目(对我来说)这将有许多类,将需要可扩展的,但我不知道如何规划出我的程序和类需要如何进行交互。
我花了一个OOD课程几个学期回来,并从中学到了很多东西; 就像写UML,和翻译要求文档转换成对象和类。 我们了解到序列图过,但不知何故我错过了讲座或东西,他们并没有真正坚持和我在一起。
与以前的项目,我用我从课程中学,但通常与代码,只要我可以说结束了方法试图“是啊,看起来像什么,我脑子里想的”我无意通过渣土挖加新功能。
我已经得到了史蒂夫·麦康奈尔的代码的拷贝完成 ,这我不断听到的是惊人的,在这里和其他地方。 我读了设计的章节,似乎没有拿出我正在寻找的信息。 我知道他说,这是不是一个切口干燥过程中,它主要是基于启发式方法,但我似乎无法把他的所有信息,并将其应用到我的项目。
(你开始编程之前),以确定哪些是你需要的类(不基于任何“现实世界对象的特别是那些)那么, 什么东西你在高水平的设计阶段,以及它们会互相影响 ?
具体来说,我很感兴趣的是,你使用的方法? 什么是你按照通常yeilds一个良好的,干净的设计,将密切代表最终产品的过程?
Answer 1:
我使用的初始设计(获得到一个类图)的步骤,分别是:
需求收集。 聊到客户端,并分解出的用例来定义软件应具备哪些功能。
撰写的个人使用情况叙述。
通过叙述和亮点名词(人,地,事)去,作为候选类和动词(行动),因为方法/行为。
丢弃重复的名词,并分解出常见的功能。
创建一个类图。 如果你是一个Java开发人员,NetBeans的6.7 Sun有一个UML模块,从而可图表以及往返式设计,它是免费的。 蚀(一个开源的Java IDE),也有一个模型框架,但我与它没有任何经验。 您也可以尝试的ArgoUML,一个开源工具。
应用OOD的原则来组织你的类(分解出常见的功能,建立层次结构等)
Answer 2:
我没有足够的声誉作出评论(今天加入),或者我对斯科特·戴维斯的回答只是发表评论。 添加到什么,他说的话:
绝对确保你知道你的程序是怎么一回事,然后再开始。 什么是你的计划? 会是什么不能做? 什么问题是,它试图解决?
你第一套的使用情况不应该是一切程序将最终做一箩筐。 先从最小的用例集,你能想出仍然抓住了你的程序是什么的本质。 对于这个网站,例如,核心使用情况可能会登录 , 问一个问题 , 回答问题 ,并查看问题和答案 。 一无所知的声誉,投票,或社区维基,只是你拍摄的内容的原始本质。
当你拿出潜在的班,不只是在什么名词所代表方面来考虑他们,但他们有什么责任。 我发现这是搞清楚如何类程序执行过程中相互关联的最大的援助。 这很容易拿出像“狗是动物”或关系“小狗有一个母亲。” 它通常是很难搞清楚描述对象之间的运行时间的互动关系。 你的程序的算法,至少同样重要的对象,而且他们更容易设计,如果你已经阐明了每一类的工作是什么。
一旦你得到了一套最小的用例和对象,开始编码。 获取实际尽快运行,即使它并没有做太多,可能看起来像废话的东西。 这是一个起点,将迫使你回答问题,你可能会掩盖在纸面上。
现在回去,并选择更多的使用情况,写出他们将如何工作,修改你的类模型,并写更多的代码。 就像你第一次切割,采取尽可能少的同时,你可以同时仍然在增加一些有意义的事。 冲洗和重复。
只是我的两分钱。 希望这是非常有用的。
Answer 3:
当我有机会,我通常使用我所说的“三个迭代法则”。
在第一次迭代(或启动),我设计的应用程序的总体布局根据模型对象,算法,和预期( 实料,没有也许预期)未来的发展方向。 我不写设计文档,但如果我必须协调多人,程序的草图是需要的,当然,与相关性分析和鉴别力所需要的时间在一起。 尝试,如果像我一样,你喜欢一个更灵活的方法来这个阶段保持在最低水平。 在有些情况下需要一个强大的设计阶段,尤其是当一切是已知的,关于你的程序的逻辑真实的情况下,如果你计划有特征之间的很多交互的代码。 在这种情况下,用例或用户故事提供了是一个不错的高层次的想法,尤其是对于GUI应用。 对于命令行应用程序,特别是图书馆,尝试写在你的代码对你有制定并检查它的外观库“节目的故事。” 完成时,这些方案将成为库的功能测试。
这第一次迭代后,你将有怎样的东西互动更好地了解,下了细节和粗点,解决了一个耳光胶带修补程序的问题。 您已经准备好利用这方面的经验,提高,清洁,抛光,分什么过大,凝聚什么过于分散,定义和使用设计模式,分析性能瓶颈,以及重要的安全问题。 在一般情况下,所有这些变化会对你写单元测试了巨大的冲击,但不是在功能测试。
当你完成这第二次迭代,你将有一个小宝石,行之有效的,有据可查的,而精心设计的。 现在你有两个经验和代码做第三次迭代,延伸。 您将添加新的功能和使用情况,以提高应用程序。 你会发现起争执,你会最终进入第四次迭代这类似于第二个。 冲洗和重复。
这是我对软件设计的一般方法。 它类似于螺旋设计,与短三个月迭代和敏捷开发,它允许你学习的问题,并了解你的软件及其应用领域的元素。 当然,它的可扩展性的问题,因此,如果应用程序是如此之大,涉及数百个开发商,事情比这更复杂一点,但最终我猜的想法是始终不变的, 分 而治之 。
所以总结:
- 在一次反复中,你得到它的味道,和学习
- 在迭代二,你清理你的产品,并为未来做准备
- 在迭代三,你添加新的功能,并了解更多
- 转到2
Answer 4:
我知道这方面的最有趣的来源是d部分面向对象的软件建设,第二版由伯特兰·迈耶。
部分d:面向对象方法:应用该方法好
19:在方法学,20:设计模式:多屏互动系统,21:继承案例研究:“撤消”在交互系统,22: 如何找到班 ,23:一流的设计,24原则:使用继承好,25:有用的技术,26:造型感,27:面向对象的分析,28:软件施工过程中,29:教学方法
有趣的是,章22.如何找到类可在网上。
Answer 5:
这是经常重复的,但完全真实的 - 了解你的数据。
对于OOP你的类应该描述的信息,以及它们如何相互作用突出件。
如果你有一个很好描述的行为和数据的生命周期的心理模型,你就会有一种轻松过关奠定了自己的类。
这是一个简单的扩展:知道你想要做什么。
Answer 6:
尝试使用行为驱动开发。 这将是很难打破旧的习惯,但我发现BDD真的是你最好的选择,当谈到在现实世界中发展。
http://behaviour-driven.org/
Answer 7:
在大型项目中的问题是,你不能监督所有组件之间的交互。 它减少项目的复杂性是重要的。 类和序列图过于详细设计的这个阶段。
首先尝试从更高的抽象层次思考。 想想主要成分及其职责(它们的接口给其他组件),看一些建筑形态中寻找灵感(不,不是设计模式,这些都太低级!MVC和多层是架构模式的例子)。 对于相当大的项目,这样的观点应该有3-5组件。
只有这样,你放大到一定的分量,并尝试设计出。 现在,我们正处于设计模式和类图的水平。 尝试专注于这个项目的一部分,如果你发现你需要有责任加入到其它组件之一,只需将其添加到您的文档/待办事项列表。 不要浪费时间去考虑在这一点上影响他们改变过于迅速,回顾在设计时更牢固。
你不需要在这一点上完全设计中每个组件,但它可能是明智的,有一段代码实现了未实现的组件接口,并生成简单而有用的响应。 这样,您就可以在同一时间开始开发(设计)一个组件,它测试到一个合理的程度。
当然,当新的组件完成后,你应该怎么考(如果)他们在移动之前相互集成。
在很短的:以面向对象和信息隐藏的原则,并把它再升一级!
PS:很多做在设计素描的,它就像真正的建筑!
PPS:尝试从不同角度探讨这个问题,条条框框(虽然盒可能是要走的路),与同伴讨论可以为这个非常有用的...你有东西在午餐谈。
Answer 8:
我已经取得了一定成功真实的项目中使用的技术是职责驱动设计,通过夫斯-Brock的书的启发。
先从顶层用户故事,并与同事,在白板上,画出它们意味着高层次的互动。 这可以让你的大模块是什么第一个想法; 和喜欢玩你高水平的CRC卡的迭代或两个应该有所企稳主要组成部分,他们做什么,以及它们如何相互作用的列表。
然后,如果任何的责任是大型或复杂,细化这些模块,直到你拥有的东西都很小,足够简单的物体,通过打出来的模块内部的相互作用对每个由更高级别的相互作用确定的主要操作。
知道何时停止是一个判断的问题(只来自经验)。
Answer 9:
设计模式
创建型设计模式
辛格尔顿 - 确保只创建一个类的实例,并提供一个全局访问点的对象。
工厂(工厂方法的简化版本) - 创建对象,而不实例化逻辑暴露于在客户端和通过一个公共接口是指新创建的对象。
工厂方法 - 通过一个界面,用于创建对象,让子类来决定哪一个类实例,并通过一个共同的接口是指新创建的对象。
抽象工厂 - 信息的界面,用于创建一个家庭相关的对象,但没有明确指定其类。
生成器 - 用于创建对象,但让子类决定哪一个类实例,并允许在施工过程中更好的控制定义一个实例。
原型 - 指定类型的对象使用一个典型实例来创建,并通过复制这个原型创建新的对象。
行为设计模式
Responsibiliy链 - 它避免了连接到它的接收器请求的发送者,给予这样的其他对象的处理请求过的可能性。 - 目的成为链的部分和所述请求是从一个对象发送到另一个横跨链,直到对象将处理它的一个。
命令 - 封装在一个对象的请求,允许具有不同请求的客户端的参数并允许保存在队列中的请求。
解释 - 给定一个语言,定义其语法的表示与使用的表示来解释语言中的句子/ MAP域的语言,语言的语法解释器一起,和语法层次的面向对象设计
迭代器 - 提供一种方法来访问聚合对象的顺序的元件不暴露其底层表示。
中保 - 定义封装一系列的对象交互的对象。 中保促进由称呼对方明确地保持对象的松散耦合,并可以独立地改变它们之间的相互作用。
观察 - 定义,这样,当一个对象改变状态,其所有家属都自动通知和更新的对象之间的一个一对多的依赖。
策略 - 定义一系列的算法,封装每一个,使得它们可以互换。 战略让算法从使用它的客户独立变化。
模板方法 - 定义一个算法的骨架,在操作中,一些步骤延迟到子类/模板方法让子类重新定义算法的某些步骤,而不让他们改变算法的结构。
访问者 - 表示要在对象结构中的元素执行的操作/访问让你定义一个新的操作,而不改变在其上进行操作的元件的类。
空对象 - 提供一个对象作为缺乏给定类型的对象的替代。 /在空对象模式提供智能无能为力行为,隐藏其合作者的细节。
结构设计模式
适配器 - 将一个类的接口转换成另一个接口的客户期望。 /适配器允许类共同努力,无法以其它因为接口不兼容。
桥 - 撰写对象成树形结构以表示部分 - 整体层次结构。 /复合使得客户对单个对象和对象的组合物均匀地。
复合 - 撰写对象成树形结构以表示部分 - 整体层次结构。 /复合使得客户对单个对象和对象的组合物均匀地。
装饰 - 动态添加额外的责任的对象。
飞锤 - 使用共享来支持大量的共同点其内部状态的一部分,其中状态的另一部分可以改变的对象。
纪念品 - 捕获对象的内部状态,而不违反封装和因此提供的平均在需要时恢复对象进入初始状态。
代理 - 一个对象来控制引用它提供了一个“占位符”。
Answer 10:
首先, - 设计应该来自你的灵魂。 你必须通过你的每一个纤维感觉到。 我平时走路下来两三个月前,我开始做任何事情,只要走在街上(真的)。 和思考。 散步是一种很好的静心,你知道的。 因此,它可以让你集中精力好。
其次 - 使用OOP和只在一个自然物体层次结构中存在的类。 不要“螺旋式”它人为地。 如果没有严格的等级制度存在(如在大多数业务应用程序) - 去程序/功能,或者,至少使用对象只作为孤立存取数据容器。
而最后的-尝试阅读本: 创造性思维的算法
Answer 11:
只是引用http://www.fysh.org/~katie/computing/methodologies.txt
而在RUP的核心是,你必须使用面向对象的设计人才小面积....如果你没有这些,它就像是运行了100米的方法。
“步骤1:先交行:写的真快运行第二步:进入并绘制赛道的计划;第三步:再去买紧实莱卡短裤步骤4:运行真的,真的,真的快第5步“
这是该步骤4那是艰难的一个。 但是,如果你把很多偏重于1,2,3和5有可能没有人会注意到,然后你可以可能使很多钱卖的方法来会是谁觉得有一些“秘密”,以作为100米运动员在亚军
Answer 12:
你问的是很多作者用写一本书的问题。 有方法的数量,您应该选择一个似乎“最漂亮”给你。
我可以推荐的书“领域驱动设计”由埃里克·埃文斯。 此外,检查网站dddcommunity.org 。
Answer 13:
我会建议你使用BlueJ的 ,也ActiveWriter学习,也能培养对象上有很好的理解。 推荐这本书也是一个很好的资源。
从维基百科 :
BlueJ的是一个集成开发环境的Java编程语言,主要开发用于教育目的,而且也适用于小规模的软件开发。
此外,它采用UML对我来说是一个很好的资源,以了解有关对象建模几件事情。
替代文字http://www.ryanknu.com/ryan/bluej.png
ActiveWriter是模拟实体和关系的一种工具,它也产生代码,很容易做出改变。 这将节省您的时间和敏捷开发是非常合适的。
(来源: altinoren.com )
Answer 14:
我认为这里的答案应该取决于人问的现实世界的经验是非常不同的 。
如果你只有一个或两年以上工作经验,那么你一定要去那就是一点:你是怎么开始做你真正了解你的数据,准确地了解你想要做什么意义呢?
是的,如果你在现实世界中具有5年以上工作了,那么你会选择之间的任何的许多软件开发的流程模型或技术。
但是,你不要只看书获得的经验。 你应该通过良好的领导下,在一个良好的工作组学习。
如果这是不可能的,那么你应该自己做。 通过编码可能很讨厌的一段代码,学习你的错误,倾倒了这一切,编码一个更好的等开始迭代。
你会学到很多关于你的代码。 该工具是工具,他们会教你什么。
Answer 15:
如果您对项目领域的专业知识,你会喜欢说银行努力。 可以很容易地组织你的对象,你知道这些改进是怎么来隔日。
如果您没有与别人,鉴定工作谁拥有专业知识和这些想法转化为技术细节。
如果你感到困惑如何构建项目设计。 盲目追随“务实程序员”的书。 我是在同样的情况之前,尝试阅读从书中的一章。 你会看到其中的差别,它会改变你觉得作为一个软件开发的方式。
Answer 16:
- 研究和掌握设计模式。
- 接下来,了解领域驱动设计
- 在此之后,学习需求收集
我花了一个OOD课程几个学期回来,并从中学到了很多东西; 就像写UML,和翻译要求文档转换成对象和类。 我们了解到序列图过,但不知何故我错过了讲座或东西,他们并没有真正坚持和我在一起。
你知道步骤3.您需要掌握它。 我的意思是,通过大量的实践,使之成为你的第二天性。 那是因为你学习的方法,简直是对我们曾经有过的方式。 所以,你需要真正掌握它。 否则,你总是会发现自己回到你原来做事情的方式。 这是有点像测试驱动的过程,在很多Java开发人员的放弃了几次尝试之后。 除非他们完全掌握了它,否则它只是他们的负担
写用例,尤其是对替代课程。 备选过程占据我们的开发时间超过50%。 通常,当你的PM分配给你一个任务,例如,创建一个登录系统,他会认为这是简单的,你可能需要1天完成它。 但他从来没有考虑到,你需要考虑在错误的密码,1。如果用户有什么大客户,2万一3次,在错误的密码用户密钥3.如果用户不输入用户名等。你需要一一列举出来,并显示给你的PM,请他重新安排的最后期限。
Answer 17:
恐怕这不是一个答案的人喜欢听 。 无论如何,让我说出我的意见。
OOP应该被视为范例的一个,而不是作为上级范例。 OOP是很好的解决某种问题,比如开发一个GUI库。 同时,这也是软件开发的风格通常跟着大软件公司- 设计师或建筑师的精英团队,奠定了在UML图软件设计或一些其他类似的媒体和开发商不太开明的团队把这一设计成源代码。 OOP提供很少的好处,如果你是独自或与一个小的团队非常有才华的程序员的工作。 然后,最好使用支持多种范式,并会帮助你拿出一个原型快速的语言。 从Python,Ruby,Lisp语言/计划等都是不错的选择。 原型是你的设计。 然后,你就能够提高。 使用范例,它最擅长的手来解决这个问题。 如果需要,优化用C语言编写的或扩展其他一些系统语言的热点。 通过使用这些语言中的一种,您还可以扩展为免费,而不是仅仅在程序员水平,而且在用户级别。 比如Lisp语言可以动态地生成和执行代码,这意味着用户可以通过写小代码段,该软件本身被编码的语言扩展应用! 或者,如果你选择写在C或C ++程序,考虑嵌入一个解释像Lua的小语种。 揭露功能作为该语言编写的插件 。
我认为,大部分的时间OOP和OOD创建软件,是对设计的受害者。
总之,我编写软件的首选方法是:
- 使用动态语言。
- 写在语言本身的设计(原型)。
- 如果必要的话,优化使用C / C ++某些区域。
- 通过实现语言本身的解释的方式提供可扩展性。
最后一个功能使软件可以轻松地适应特定用户(包括我自己!)的要求。
Answer 18:
我使用测试驱动开发(TDD)。 先写测试实际上有助于带你到一个设计是干净的,正确的。 见http://en.wikipedia.org/wiki/Test-driven_development 。
Answer 19:
学习设计模式 。 这一直是我个人的革命有关OOP在过去的两年。 得到一本书。 我建议你这一个:
Head First设计模式
这是在Java中,但它可以扩展到任何语言。
Answer 20:
老实说,一个很好的一步会回去,看着流动的图表和序列图绘制。 有一吨很好的网站,告诉你如何做到这一点的。 我觉得它在看我多么想一个程序分解成班,因为我知道这个程序需要输入什么,计算和输出的每一步可以细分到程序的一部分时,是非常宝贵的。
Answer 21:
正如在回答什么是你按照设计该软件的工作流程你要写?
Answer 22:
一个有效的方法是将涉及您的独特问题描述的东西,你可以在现实世界中找到。 例如,你在造型复杂的医疗保健系统,将席卷走天下。 在那里,你可以很容易地呼吁建模任何的例子?
确实。 观察一下侧药店将经营,或在医生的房间。
带上您的域名问题到你的东西理解的; 东西,你可以涉及。
然后,一旦该领域内的“玩家”开始出现明显的,并且你开始模拟代码,选择一个“供应商-消费者”的建模方法,即你的代码是模型的“提供者”, 你是“消费者”。
有关域和在较高的水平理解它是任何设计的重要组成部分。
Answer 23:
在我的设计类结构的冒险,我发现这是非常有帮助的开始写一些伪代码。 这意味着:我开始与“写作”的应用程序的代码在最高级别的一些一般性的片段,用它玩,并发现不断出现的元素 - 事实上,我的元素 - 作为一个程序员 - 想用。 它的设计模块及其相互作用的一般结构一个非常好的起点。 几次反复之后,整个结构开始看起来更像一个类的完整系统。 这对于设计的部分代码非常灵活的方式。 你可以称之为一个面向程序员的设计。
文章来源: How do you design object oriented projects? [closed]