Questions tagged «software-craftsmanship»

14
应该优先考虑什么:YAGNI或Good Design?
在什么时候,YAGNI应该优先于良好的编码习惯,反之亦然?我正在研究一个正在工作的项目,并希望向我的同事缓慢介绍良好的代码标准(目前还没有,并且一切都只是某种形式而没有韵律或理由),但是在创建了一系列类之后(我们不要做TDD,或者根本不进行任何类型的单元测试。)我退后一步认为这违反了YAGNI,因为我非常确定地知道我们不需要扩展其中的某些类。 这是我意思的一个具体示例:我有一个数据访问层,其中包装了一组存储过程,该过程使用具有基本CRUD功能的基本存储库样式模式。由于所有存储库类都需要几种方法,因此我为存储库创建了一个通用接口,称为IRepository。但是,然后我为每种类型的存储库(例如ICustomerRepository)创建了一个“标记”接口(即,没有添加任何新功能的接口),具体类实现了该接口。我已经通过Factory实现完成了同样的事情,以便从存储过程返回的DataReaders / DataSets中构建业务对象。我的存储库类的签名通常看起来像这样: public class CustomerRepository : ICustomerRepository { ICustomerFactory factory = null; public CustomerRepository() : this(new CustomerFactory() { } public CustomerRepository(ICustomerFactory factory) { this.factory = factory; } public Customer Find(int customerID) { // data access stuff here return factory.Build(ds.Tables[0].Rows[0]); } } 我在这里担心的是,我违反了YAGNI,因为我有99%的确定性知道,除了CustomerFactory向该存储库提供具体内容外,没有其他理由。因为我们没有单元测试,所以我不需要任何MockCustomerFactory类似的东西,并且拥有如此多的界面可能会使我的同事感到困惑。另一方面,使用工厂的具体实现方式似乎具有设计异味。 在适当的软件设计与不过度设计解决方案之间是否有折衷的好方法?我在问我是否需要所有“单一实现接口”,或者是否可以牺牲一些好的设计,而仅拥有例如基本接口和单个具体的接口,而不用担心对该接口进行编程接口(如果实现的话)将被使用。

4
作为软件架构师,您应该提出什么建议?[关闭]
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,使它成为软件工程堆栈交换的主题。 4年前关闭。 关于StackOverflow和Programmers SE上的软件架构师(SA)的角色,存在很多问题,而且都有很好的答案。我正在尝试提出一个比那些更集中的问题。SA的定义非常广泛,因此,为解决此问题,我们将SA定义如下: 软件架构师指导项目的总体设计,参与编码工作,进行代码审查,并选择要使用的技术。 换句话说,我不是在谈论SA的波峰(不再使用押韵词)类型的管理休息和归属。如果我要从事任何类型的SA职位,我都不想远离编码。我可能会花一些时间与客户和业务分析师等进行交流,但是我仍然在技术上参与其中,而且我不仅了解会议的进行情况。 考虑到这些要点,SA应该带来什么?他们是否应该怀有“放下法律”(可以这么说)的思想,并强制某些工具的使用以符合“他们的方式”,例如编码指南,源代码控制,模式,UML文档等?还是应该指定初始方向和策略,然后根据需要摆放并跳入以纠正船的方向? 根据组织的不同,这可能不起作用。依靠TFS来执行所有事务的SA可能会在仅使用StarTeam的雇主那里难以实施其计划。同样,根据项目阶段的不同,SA也需要保持灵活性。如果这是一个新项目,则他们有更多选择,而现有项目则可能更少。 以下是一些我作为共享背景知识而经历过的SA故事,希望我的问题的答案也能为这些问题提供一些启示: 我曾与一名SA一起工作过,该SA的代码实际上检查了团队的每一行代码。SA不仅会为我们的项目,而且还会为组织中的其他项目执行此操作(想象在此上花费的时间)。起初,强制执行某些标准很有用,但后来却变得残酷。FxCop是SA如何发现问题的方法。别误会,这是教导初级开发人员并强迫他们考虑他们选择的方法的后果的好方法,但是对于高级开发人员而言,这被认为有些苛刻。 一个特定的SA反对使用某个库,声称它很慢。这迫使我们编写大量代码来实现不同的目标,而另一个库可以为我们节省很多时间。快进到项目的最后一个月,客户抱怨性能。唯一的解决方案是,尽管有开发人员的早期警告,仍要更改某些功能以使用最初忽略的方法。到那时,很多代码被扔掉并且不可重用,从而导致超时和压力。可悲的是,用于该项目的估算是基于我的项目被禁止使用的旧方法,因此它不是合适的估算指标。我会听到总理说“我们以前做过” 将在所有项目中强制使用DTO,DO,BO,服务层等的SA。新开发人员必须学习此体系结构,并且SA严格执行使用指南。当绝对难以遵循使用指南时,会出现例外情况。SA是基于他们的方法。DTO和所有CRUD操作的类都是通过CodeSmith生成的,而数据库模式则是另一个相似之处。但是,在所有地方都使用了此设置之后,SA并未接受诸如LINQ to SQL或Entity Framework之类的新技术。 我没有将此帖子用作发泄的平台。我对上述SA故事的经历有正面和负面的方面。我的问题归结为: SA应该带来什么? 他们如何在决策中取得平衡? 是否应该以必须执行某些基本规则的心态来从事SA工作(如先前所定义)? 还有什么需要考虑的吗? 谢谢!我确信这些工作任务很容易扩展到高级开发人员或技术负责人,因此也可以以这种身份随意回答。

9
掌握JavaScript的途径是什么?[关闭]
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案会得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 7年前关闭。 我知道我们是如何从JavaScript开始的,我们剪切并粘贴了代码片段以获取一些客户端功能或验证。 但是,如果您遵循这种方式尝试实现丰富的交互行为,那么不久之后您就会意识到自己正在创建一个“大泥浆球”。 那么,在交互层编程中寻求专业知识的途径是什么?哪些书籍,教程,练习和过程有助于编程强大,可维护的JavaScript? 我们都知道练习对任何努力都很重要,但我正在寻找与此处答案类似的路径:https : //stackoverflow.com/questions/2573135/

5
让所有开发人员进行代码审查
我是7-8个开发人员团队中的软件开发人员。我们已经进行了一段时间的代码审查,并且随着时间的推移,代码质量也有所提高。 但是我最近注意到,与其他开发人员相比,一些开发人员被要求进行更多的代码审查。恐怕是因为他们态度灵活。 在我看来,这不是应该执行代码审查的方式:所有团队都应对此负责,并且不应因为愿意接受更改而选择代码审查者。 您如何处理团队中的这个问题? 您是否建立了选择代码审查者的规则? 您认为代码审查者应该花时间进行(良好)代码审查而获得报酬吗?以及如何获得奖励? 感谢您的回答/想法。

2
避免获取和设置方法,显示用户信息
背景 我正在阅读“清洁代码手册”,并且在并行中,我正在像银行账户那样从事诸如体操之类的身体对象卡塔(Kata)的研究: 健美操对象的第9条规则是我们不要使用吸气剂或吸气剂。 看起来很有趣,我同意这一原则。而且,在“清洁代码”的第98-99页,作者解释说,getters / setters破坏了抽象,并且我们不必询问对象,而必须告诉对象。 在我看来,这是完全合理的,我完全同意这一原则。问题出在实践中。 语境 例如,我有一个必须列出一些用户并显示用户详细信息的应用程序。 我的用户包括: -> Name --> Firstname --> String --> Lastname --> String -> PostalAddress --> Street --> String --> PostalCode --> String 问题 当我只需要显示一个简单的信息(并且我必须确认我不需要对该特定字段进行额外的操作)时,我该怎么办?或者如何避免吸气剂以简单的方式显示Firstname值(随机)输出支持? 我想到什么 一种解决方案是: user.getName().getFirstName().getStringValue() 这非常可怕,违反了许多健美操规则,并违反了Demeter法则。 另一个可能是这样的: String firstName = user.provideFirstnameForOutput(); // That would have called in the user object …
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.