问题标签 [design-principles]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
oop - 没有行为的对象
我有一个与一般 OOP 相关的问题,而不是特定于语言的问题。我正在尝试一个简单的应用程序(在 java 中),并且我试图将它建模为一个真实世界的场景。在重构时,我意识到我想出了一个简单的对象,它只有一个成员和一个覆盖的等号和哈希码。
我的问题是....拥有这样的对象是一种不好的做法吗(欢迎引用博客等)
database-design - 图数据库设计原则、一般原则和粒度问题
在关系数据库设计中,有规范的形式来指导设计过程。是否有类似的原则适用于 Neo4j 等图形数据库的设计?
特别是,我对问题粒度感到困惑:我可以设计一个图形数据库,其中大多数属性存储在顶点中(联系人具有属性名称、出生日期等),或者我可以将大多数数据存储在关系中(连接与保存实际信息的另一个顶点的“名字”关系的联系)或者我可以两者都做(当然会出现一致性问题,但它可能会加快检索时间)。
这些问题和我刚开始 SQL 设计时的初学者问题很相似,很多问题只能通过积累经验来解决。你还能推荐一本关于这个主题的基础知识的好书吗?或者告诉我在哪里可以找到一些一般原则?
c# - 接口,接口客户端,vs继承,软件设计原则,组件封装问题
我遇到了一个关于如何打包接口、接口客户端和继承的问题。也就是在下面的书中,作者提到Switachable更适合与Switch一起作为组件部署,而不是Light。
我想了解的是它背后的原因(Switch 和 Switchable 都封装在一个组件中,而不是 Switchable 和 Light),如果可能的话,还可以举个例子。
我认为在某些情况下这两种情况都有效。与该设计相反的一个示例是,IStream、FileStream 在一个组件中,ISream 客户端在另一个组件中。
下面是来自 unclebob 在 C# ch 33, p497 中的敏捷。
coding-style - 什么时候违反单一责任原则是合理的?
在我们的 java web 应用程序中重构了一些服务层类之后,我问自己在什么时候停止遵守单一职责原则 (SRP) 并保持代码的可维护性和可读性是合理的。现在我问你关于这个问题的经验。
例子:
假设一个 UserManager 类执行以下操作:
- 从数据库中查找用户
- 创建新用户
- 操纵现有用户
案例 A:这三个职责中的每一个都由执行其任务的几种方法组成。
→ 很明显,我将其分为三个类别。
案例 B:这三个职责中的每一个都只包含一个方法。
→在这种情况下,您有什么建议?这应该分成三个小类还是留在 UserManager 类中?
oop - 最佳实践:默认和测试驱动开发的受保护或私有方法
类似问题
我的问题
许多人同意只有当你有理由使用受保护的方法时才应该使用它们。测试驱动的开发模型如何实现这一点?(特别是关于伪造对象。)我有一个朋友是 TDD 的忠实粉丝,现在是 BDD 并且是 C# 开发人员,他告诉我他几乎不使用private
关键字。在他这么说之后,我继续将它用于字段,但开始将我的所有方法默认为protected
. StackOverflow 上的一些人也同意protected
默认情况下应该使用它——你们中的一些人可以权衡一下这个问题吗?默认使用的最佳理由是什么protected
(因为上面的线程解释了不使用的原因)?
编辑:根据 Oded 的评论,protected
默认情况下使用和开闭原则(一个类应该对扩展开放,对修改关闭)怎么样?
c# - 在继续之前验证一堆变量的有效方法是什么?
我一直在阅读有关方法的理想大小和单一职责原则的信息,然后我去看看我的一些代码。我觉得我可以将很多(>90%)的东西分解成小的可管理的方法,然后我可以验证数据或表单。它总是看起来非常大而且臃肿。我倾向于使用嵌套的 if 语句验证我的数据,并尝试在每个级别捕获错误或问题。但是当我开始获得 6、8、10+ 级别的验证时,这非常麻烦。但我不确定如何将其分解以更有效。
下面是一个我认为很麻烦但不确定如何改进的例子。每个级别都有一个与之相关的独特动作,只有当所有条件都返回 true 时,整个事情才能返回true
,但这很难阅读,尤其是在一个月左右后回到程序之后。
java - Java 程序设计 - 洗牌器
我正在尝试编写洗牌器,并且我知道我希望洗牌的方法。但是,我不知道编写它的最佳面向对象方式。
该方法是一种比较常见的方法,如下所示:
- 为每个分配一个随机数值,介于 0 和 2,147,483,647 之间
- 如果有重复的键值(非常不可能),扔掉套牌,然后重新开始。
- 将卡片存放在一组中
- 按每张卡片键值对集合进行排序
我的问题在于最好的 OOP 方式来写这个。起初我想出了一个名为 的对象Card
,其中包含一个花色值、一个数字值和随机键值。然后我会有一个名为Deck
扩展 a的类HashSet
,我会将每张卡片存储到 中HashSet
,然后按键值对其进行排序。我挣扎的地方是,首先“生成” 52 个对象的最有效方法是什么Card
,以及如何订购集合。我会实现接口“SortedSet”吗?如果是,我将如何编写比较器?
相当广泛的问题,更多基于 OOP 设计实践,但我希望这是一个非常流畅且基于对象的解决方案。
干杯,
蒂姆。
编辑:
感谢大家的帮助。我的解决方案如下:
- 2 个枚举(CardValues、CardSuits),包含 4 个花色和 13 个可能的值
- Card 类,将 CardValue 和 CardSuit 作为构造函数参数。
- 扩展 TreeMap 的 Deck 类
当创建和洗牌新牌组时,我循环遍历 CardSuit 枚举并创建卡片,然后在该循环中,我遍历 CardValue 枚举。这将创建卡片,然后我生成一个随机密钥并将它们放入 TreeMap。
由于按键重复的可能性很小,如果最终的牌组大小不是 52,我会抛出一个新的 InvalidDeckException。
感谢您的建议,我对这个解决方案更满意。
c# - 帮助在提供的场景中选择我的 DDD 聚合根?
我对 DDD 相当陌生,并且已经阅读了一些关于这个概念的文章,如果我缺乏一些知识,请原谅。我很好奇这个例子应该如何用聚合根来建模。
基础是:有一个员工,一个会议和评论。每个员工都可以参加他们可以发表评论的会议。根据员工和会议跟踪评论。每个会议和员工都有唯一的标识符。
如果我想显示会议中的所有评论,而不考虑员工,我是否必须首先获取属于该会议的所有员工,然后对评论进行排序以仅显示与会议 ID 匹配的评论?
会议不能成为我的总根,因为当我需要一份员工名单时,我当然不想通过会议来获得它。也许每个都是一个聚合根,但评论在员工之外真的没有意义。我正在寻找有关如何更好地处理这种情况的想法。
在此先感谢您的帮助。
php - 网络编程原则
来自一些传统的(如果生疏的)编程背景,我正忙于掌握网站的“无状态”性质。这是一个相当大的思维转变!
我为我工作的团队创建了一个小型网站,用于在内部跟踪我们日常工作的某些方面。该网站功能齐全,我为我设法提出的内容感到非常自豪,bla bla bla。
但是,我在某处读到了一些东西,表明我可能做得不好。特别是,团队网站的中心页面完成了大部分工作。它检查您来自哪里,然后“切换”以执行一些工作(在数据库中进行一些更改),然后再次呈现页面。
在许多情况下,页面只是调用自己!我要做的是展示一张桌子。每行的最后一列是一组 html 表单。每个表单都有一个提交按钮,至少有一个隐藏字段。“提交”按钮具有名称/值,例如“删除”“修改”“存档”等。
如果$_POST['submit'] == "delete"
然后我在由隐藏字段标识的行上执行该功能。对“存档”的访问。对于修改,我打开一个新页面,显示一个带有默认值的表单,当用户提交表单时,再次调用 PHP 主页面在显示表格之前执行 SQL 更新。
因此,基本上在主页开始附近的一个大型(并且不断增长的)案例结构完成了大部分工作,甚至包括登录按钮!
这样看起来很整洁和有条理,但我有两个问题:
当用户按下返回时,有没有办法消除“重新发送表单数据”提示?大多数时候,后退按钮在这个网站上没有多大意义,但我们在这里与人打交道。我注意到其他人发布了关于注销按钮等类似问题,但到目前为止我找到的答案对我来说意义不大或毫无意义。
这是不好的编程实践,尤其是整个 PHP-calls-itself-from-a-form-action 概念....?
谢谢你的时间!
python - 在 Python 中动态添加属性是否令人不悦?
在 Python 中,您可以从定义类之外分配任意属性:
这里的底层机制是__dict__
维护所有属性的字典的属性。
我们都被告知不要将我们的内部工作暴露给客户端代码,但是附加新数据根本与封装无关,对吧?这个成语在 Python 代码中很常见吗?
就是我的意思……</h2>
每个Tweet
都有标准字段,例如id
, text
, owner
。
当返回一个用户的推文列表时,你想显示一条推文是否被这个用户“收藏”。
显然,要获得这个,is_favorite
您需要查询多对多关系user
。
可以用当前用户对应的对象预填充Tweet
对象is_favorite
吗?
当然我可以公开一个方法is_favorite_for(user)
,但是我遇到了Django 模板语言限制,它不允许从模板内部调用带有参数的方法。另外,我相信模板根本不应该调用方法。
我知道这会很好,但我想知道在开源项目中做这样的事情是否会让其他开发人员鄙视我。
边注:
我来自 C#/.NET 背景,其中动态类型是最近引入的,除了一些利基领域(互操作性、IoC 框架、REST 客户端框架等)外,并未得到广泛应用。