Architecture 最佳实践-编码前设计

Architecture 最佳实践-编码前设计,architecture,Architecture,我很好奇你们怎么想?(我指的是一种思维方式)在开始编码之前,先设计库、系统、框架等的体系结构 最近,我发现自己在所做的事情中感到痛苦,几乎每次我都想从头开始 我以前做过设计,在纸上画过一些方案,想象它将如何工作,但也许我做得不对 例如,您如何决定需要什么接口,或者如何以最佳方式连接所有内容 (前一天我遇到了一个问题,我的朋友问我前一段时间我做了什么,我没有给他一个文件,而是给了他大约3-4个文件,这是因为它们以某种方式连接在一起……但我认为不是正确的:)所以这是我在设计上的错误。对于面向对象的方

我很好奇你们怎么想?(我指的是一种思维方式)在开始编码之前,先设计库、系统、框架等的体系结构

最近,我发现自己在所做的事情中感到痛苦,几乎每次我都想从头开始

我以前做过设计,在纸上画过一些方案,想象它将如何工作,但也许我做得不对

例如,您如何决定需要什么接口,或者如何以最佳方式连接所有内容


(前一天我遇到了一个问题,我的朋友问我前一段时间我做了什么,我没有给他一个文件,而是给了他大约3-4个文件,这是因为它们以某种方式连接在一起……但我认为不是正确的:)所以这是我在设计上的错误。

对于面向对象的方法,我发现通常最好暂时离开用户界面,关注系统中将存在哪些实体(对象),以及哪些属性和操作是合适的

在白板或大张纸上画画,使用不同的颜色来识别各种特征也是一个好主意。便利贴也是可视化模型的好方法


即使我花了很多时间仔细地思考一个设计,我最终还是会不断地修改它。因此,请记住,当您决定如何记录您的设计时,您的设计将发生变化。

虽然不是您问题的完整答案,有时,我发现最简单的方法就是找到一小块独立的功能,开始工作,同时考虑更大的前景

这样,你就不会太在意每一个细节,变得高效,给自己喘息的空间,看清楚你需要做什么


就像我说的,不是答案。

开放性问题。答案几乎和海报一样多。 1) 看看许多软件工程书籍。有些人认为好的设计很好,其余的都是小菜一碟。那是个彻头彻尾的谎言 2) 看看不同的框架有多具有侵入性,你最好按照预期的方式使用它们,否则你最好根据自己的需要再次实现这些东西 3) 设计和任何文字一样需要不断的变化。你看到这些句子,但你觉得它们不完全合适。所以你重写它。因此,每一个设计都必须考虑到,在您编写设计时,事物看起来是不同的

问候
弗里德里希

我通常从一盒卡片开始,写下我想建模的领域的概念。有时候我会用思维导图来做这件事

看看利益相关者,以及他们想要实现的目标。从这里开始是很重要的,因为它允许您正确地划分优先级(即不是在最有趣的技术部分,而是在最有商业价值的部分)

关于设计的思考主要写在测试中。在实现它的代码之前编写。从利益相关者的最终目标开始,从那里向后工作到开始(时间倒转)。这确保你专注于什么,而不是如何。对象之间的交互比对象属性更重要

另一部分主要在白板上。如今,小型数码相机是标准设备

在有三个需要框架的实现之前,先做一个框架是不好的做法。如果必须的话,请为重大的接口(和实现)更改做好准备

见:


    • 问题是,当你开始一个新项目时,它往往是新的(现在不是很明显)。一般来说,一个人是不会马上理解新事物的,除非你有一个非常专业的顾问一遍又一遍地做同样的事情,这听起来有点奇怪


      因为你不可避免地对自己设计的系统是新的,你的设计和代码在第一次就不会完美,所以你会重复设计并重构代码,直到它准备好。

      我通常花大约2-4个小时来设计我的应用程序,然后把它写在笔记本上

      然后我开始编码,每当我的事情变得复杂时(因为有些东西不在正确的位置),我就会重构。将一个类移动到另一个包,或提取方法等。当“设计”感觉正确时,我可以继续

      这样我就避免了经常发生在我身上的“分析瘫痪”。很多时候,当我预先过度设计时,我最终没有使用一些工件

      因此,我采取了这种更“敏捷”的方法

      快速绘制设计草图,并在运行中“细化”(通过重构)

      当然,这对于小型应用程序是可能的(2-4周)

      我建议你读一读这篇文章:来自马丁·福勒。这本书有点长,但值得一读

      编辑


      乔舒亚·布洛赫(Joshua Bloch)的附加链接(稍微偏离主题)。当你的API有受众时,谈谈设计的相关性。总之,从尽可能私人的地方开始,然后从那里开始发展。

      这必须是一种平衡

      如果你试图用白板上的大量图片预先设计每件事,那么当你真正开始编码时,你可能会错过一些细节

      如果你开始攻击系统的某个小部分,你可能会看不到“大局”,最终导致糟糕的设计

      当您查看库时,您希望它们尽可能可重用。因此,对于最初的设计,在您已经知道的库的预期用途中,考虑最一般的情况——在这个阶段,不要太担心可能永远不会发生的假设性未来用途。当您了解更多信息并发现设计中的问题时,使用单元测试和重构来编写设计代码。 User presses the "magic" button. System displays next weeks winning number. User writes down number. User buys lottery ticket. Lottery draws winning number. User claims money lottery pays up. User presses "magic" button System selects next weeks numbers. System logs on to lottery system. System enters winning numbers. Lottery selects winning numbers. Lottery transfers winnings to users account. User spends money.
      if arguements.debug:
          debug.init()
      
      try:
          graphics.init()
          sound.init()
          physics.init()
          input.init()
          loop.start("scene1")
      except Exception, e:
          print "Error!"
          print e