- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我听到的最常见的关于不遵守 SOLID 的争论之一面向对象设计的原则是YAGNI (尽管争论者通常不这样调用它):
“我可以将功能 X 和功能 Y 放入同一个类中。这么简单,为什么要费心添加一个新类(即复杂性)。”
“是的,我可以将所有业务逻辑直接放入 GUI 代码中,这样更容易、更快捷。这将永远是唯一的 GUI,并且不太可能出现重要的新需求。”
“如果在不太可能出现的新需求情况下,我的代码变得太困惑,我仍然可以针对新需求进行重构。所以你的‘如果以后需要……怎么办’的论点不算数。”
您反对这种做法的最有说服力的论据是什么?我怎样才能真正表明这是一种昂贵的做法,特别是对于那些在软件开发方面没有太多经验的人来说。
最佳答案
设计是权衡的管理和平衡。YAGNI 和 SOLID 并不冲突:前者说何时添加功能,后者说如何,但它们都指导设计过程。下面,我对您的每个具体报价的回复都使用了 YAGNI 和 SOLID 的原则。
- It is three times as difficult to build reusable components as single use components.
- A reusable component should be tried out in three different applications before it will be sufficiently general to accept into a reuse library.
— Robert Glass' Rules of Three, Facts and Fallacies of Software Engineering
重构为可重用组件的关键要素是首先在多个位置找到相同的用途,然后然后移动它。在这种情况下,YAGNI 通过在需要的地方内联该目的来应用,而不用担心可能的重复,而不是添加通用或可重用的功能(类和函数)。
在初始设计中,显示 YAGNI 何时不适用的最佳方法是确定具体要求。换句话说,在编写代码之前进行一些重构,以表明重复不仅是可能的,而且已经存在:这证明了额外的努力是值得的。
<小时/>Yes, I can put all my business logic directly into the GUI code it is much easier and quicker. This will always be the only GUI and it is highly unlikely that signifcant new requirements will ever come in.
它真的是唯一的用户界面吗?是否有计划后台批处理模式?会有网络界面吗?
您的测试计划是什么?您是否会在没有 GUI 的情况下测试后端功能?什么将使 GUI 易于测试,因为您通常不想测试外部代码(例如平台通用 GUI 控件),而是专注于您的项目。
It is OK that I put both feature X and feature Y into the same class. It is so simple why bother adding a new class (i.e. complexity).
您能指出一个需要避免的常见错误吗?有些事情很简单,例如对一个数字进行平方(x * x
与 squared(x)
)作为一个过于简单的示例,但如果你能指出一个具体的例子某人所犯的错误(尤其是在您的项目中或您团队中的错误)您可以展示公共(public)类或函数将如何在将来避免这种情况。
If, in the unlikely case of new requirements, my code gets too cluttered I still can refactor for the new requirement. So your "What if you later need to..." argument doesn't count.
这里的问题是“不太可能”的假设。你同意这不太可能吗?如果是这样,那么您同意这个人的观点。如果不是,那么你的设计理念与此人的设计理念不一致——解决差异就能解决问题,或者至少告诉你下一步该去哪里。 :)
关于oop - SOLID 与 YAGNI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3921904/
我想知道大括号在那种情况下是什么意思? uint64 configCount = s_configCount; { s_hotVars.latestConfigDigest = c
我正在运行一个独立的单用户 v5 节点实体服务器。当我以该单个用户身份登录时,我能够在一个不存在的容器中创建一个文档,并且服务器会为我创建该容器。 例如 POST https://my.server:
我想覆盖以下继承函数: function _setBaseURI(string memory baseURI) public override(ERC721Full, ERC721Metadata
我定义了一个映射类型的状态变量,例如映射(uint256 => uint256[])。我想将其公开,以便我可以从契约(Contract)外部访问它。但是,编译器报告错误 TypeError: Wron
我正在处理 Solidity 智能合约,并且正在导入 openzeppelin-solidity 库和 chainlink 库。 两者都有 SafeMath 库;我正在用 Python 加载所有 .s
我在以下示例中遇到了 Solidity Documentation 并且在我的项目中有类似的代码并想设置 default value如果键不是从调用者传递过来的,则到 key 参数 pragma so
据我所知,有两种方法可以获得某个地址的余额。 address firstAddress; "firstAddress.balance"这将获得地址“firstAddress”的余额。 address
我正在使用 solidity 构建一个 NFT 智能合约,并且我试图在部署合约时将 Array of Structs 传递到构造函数中。但是我收到以下错误。 TypeError: Cannot rea
免费的 Everscale Solidity。如何与负责 职能部门合作?如何正确等待回调并从sdk查看合约执行结果? 例如,我有契约(Contract)(没有任何用处)。如何在我的应用程序中以正确的方
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 3 年前。 Improve
我最近在很多代码中注意到人们将硬编码的配置(如端口号等)值放在类/方法的深处,使其难以找到,也无法配置。 这是否违反了 SOLID 原则?如果不是,我是否可以向我的团队成员引用另一个“原则”来说明为什
Solidity 最近的变化将回退函数格式从只是 function() 更改为 fallback(),这对于初学者来说非常好理解发生了什么,但是我有一个问题,关于编译器在我实现时给我的建议后备。 例如
如果我有类似的东西 class square : figure {} class triangle : figure {} 这是否意味着我永远不应该使用正方形和三角形类而只能引用图形? 永远不要这样做
我正在尝试将字节可靠地转换为 uint256。这是坚固的代码, // SPDX-License-Identifier: MIT pragma solidity 0.8.13; contract Sam
我想在 SolidJS 中动态设置 JSX 标签名称。我来自 React it is fairly simple to do : /* Working ReactJS Code: */ export
我正在尝试将字节可靠地转换为 uint256。这是坚固的代码, // SPDX-License-Identifier: MIT pragma solidity 0.8.13; contract Sam
我想在 SolidJS 中动态设置 JSX 标签名称。我来自 React it is fairly simple to do : /* Working ReactJS Code: */ export
我正在继续开发 ASP.NET 应用程序(基于 Web 表单),其中以前的开发人员没有遵循良好的面向对象设计原则,即 SOLID (http://www.remondo.net/solid-princ
我创建了 ERC20 代币,我想将我的代币转移到另一个地址。 我的元掩码中有两个帐户。(帐户 A/B) 我的 ERC20 代码在这里(我在账户 A 中部署并保存了代币) pragma solidity
struct Test { uint ui; string s; } function test(Test t) public { emit Log(t.ui, t.s); } 我对 AB
我是一名优秀的程序员,十分优秀!