问题标签 [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.

0 投票
1 回答
1519 浏览

c# - 工厂模式实现加上读写

我正在尝试以正确的方式设计应用程序,它应该

  1. 从 SQL Server 读取发票数据(根据发票类型进行 2 次查询:销售或采购)
  2. 处理它(Acme 可能需要比 SugarCorp 更少的字段和不同的格式)
  3. 输出 txt 或 csv(将来可能会改变)

我发现工厂模式很有帮助,所以根据我的关注准备了一个 UML 图。

UML 图

每个都InvoiceFactoryProvider可以生成PInvoiceSInvoice(特定于它们)。CreatePInvoice()并且CreateSInvoice()应该调用load()save()方法。

如何load()与 SQLReader 类结合以获取每一行作为PInvoice对象?和save()我的IDataWriter界面。你能提供一些例子/建议吗?

编辑:

在查看了桥接模式的示例后,正如 Atul 所建议的,我使用它为这个问题创建了一个类图,如下所示:

UML 图 - 桥接模式

InvoiceSQL 查询可能会有所不同(应用程序可能会从不同的系统加载发票数据 -PollosInvoiceStarInvoice)以及它们的处理方式(不同的实现)。

在这种情况下,我将抽象Invoice从其实现中分离出来,将发票导出到某些软件(AcmeExporterSigmaExporter)。AcmeExporter并将SigmaExport根据规范设置它们的字段——从 Invoice 的 DataTable 中获取的交易日期、付款方式、发票类型等。ExportInvoice()将返回DataTable所需的数据。InvoiceExporter也是使用编码和文件格式两个接口。

你怎么看待这件事?它有什么样的缺陷/优势?

0 投票
2 回答
1085 浏览

c++ - 一个事件系统 - 像 Qt 中的信号/插槽,没有分叉 - C++

我想知道如何设计一个系统,它可以提供一个可靠的框架来处理信号以及信号/s 和方法/s 之间的连接,而无需编写一个非常不愉快的循环,该循环通过一些用于分叉流的语句反复迭代的应用程序。

换句话说,我想知道 Qt 或类似的信号槽机制背后的理论。

我命名 Qt 没有特别的原因,它可能是最常用和经过良好测试的库之一,因此它是 C++ 世界的参考,但任何关于这种机制设计的想法都会很好。

谢谢。

0 投票
2 回答
897 浏览

c# - 搜索参数

我有一个屏幕,它对数据库员工表进行基本搜索。

用户将按名字、姓氏、部门、IsActive 等进行搜索。

到目前为止,我已经创建了一个 SearchParameter 类:

如果我有更多支持自定义分页的选项(例如开始行号、结束行号、排序依据等),这是否会灵活?

或者我可以创建一个抽象类Search 并实现?

或 ISearch界面

对于更好的设计/简单性和不过度设计问题的任何输入?

0 投票
1 回答
423 浏览

oop - C++ 游戏设计原则

我是stackover的新手,这是我第一次发帖,所以请温柔:-)

我正在开发一个多层次的射击游戏,并且我正在质疑针对我的目的最好的 OOP 设计,明确地管理子弹。

一般来说,游戏有多个玩家和多个敌人,每个人都有一把可以发射子弹的枪。有一些子弹类可以很好地管理多个子弹,它们的位置、动画、渲染等,这些都可以正常工作。

我的问题是,我是最好为每个敌人实例化这些子弹类的实例,还是最好为管理所有子弹的关卡实例化一个实例(不管是谁发射的)?

单个实例的好处是子弹管理和渲染可以同时针对它们进行优化,但是它们需要额外的状态信息,以便我们记住哪些子弹属于谁,每个敌人可以存在多少子弹等,并且没有那么松散耦合。每个敌人一个单独的实例的好处是它更整洁,每个子弹需要存储的状态信息更少,但是它们将在每个敌人或玩家的单独调用中进行管理和渲染。子弹间的碰撞也将被证明更加困难,但幸运的是这不是这个特定游戏的要求。

有没有其他人写过类似的东西,你是如何构建它的?在决定之前我应该​​考虑哪些因素,是否有任何游戏设计原则?

问候尼克

0 投票
2 回答
83 浏览

database-design - 在数据库中复制数据 - Web 应用程序项目

我和 2 个朋友正在开始一个项目,一个简单的社交网络应用程序。困扰我的问题是我们有一个表Wallet,它将存储两个用户之间所有交易值的总和。

根据以前版本的经验,我们决定复制钱包条目,因此如果总共User1User2200 美元,Wallet将有 2 个条目:

这在创建所有用户债务和信用的列表时会很有帮助,因为我们可以只选择所有条目,WHERE UserID=user. 如果金额为正,我们的朋友欠我们,如果为负,我们欠我们的朋友。

以前的概念是这样的:

User1200User2美元将生成一个条目:

但是选择所有信用和债务将需要WHERE CreditorUserId=user OR DebtorUserID=user并且在显示它时我们必须检查当前用户在哪一列中列出并相应地修改金额(正数表示欠款和负数 - 相反,因此在网站上显示债务/信用DebtorUser时,我们需要将 -200$ 更改为 200$,如列中所示)。CreditorUserUser2User2DebtorUserID

我们发现重复数据解决方案要容易得多,但这个项目主要用于教育目的,所以我们的首要任务是使用良好的编程实践,有些人说重复数据不是一个。你怎么看?

0 投票
1 回答
82 浏览

java - java中如何使用开闭原理进行网页操作调用?

我有一个网页,用户可以在其中填写和提交表单:

在服务器端:

我不喜欢这种架构,因为它违反了开闭原则。是否有可能重构这个来解决这个问题?谢谢。

0 投票
3 回答
496 浏览

java - Java中正确的继承架构

我有点进退两难。我有 class animal,假设它存储基本的东西,如位置等。所以我有一个smartAnimal扩展的类animal。假设smartAnimal添加了一些无需用户输入即可做出决策的功能。

现在,我有一个dog扩展类animal。它不会扩展smartAnimal,因为它不需要该功能。到目前为止我很好: adog是一个animal并且 asmartAnimal是一个animal。但现在我希望smartDog扩展smartAnimalsmartDog也应该是一个dog. 例如,常规中的很多功能,dog比如说.sniff(), .poop(),并且.bark()也应该在我的smartDog,但除非我从字面上复制+粘贴代码,否则它不会是,因为 Java 不允许多重继承。

组合似乎不优雅,因为如果我有:

class smartDog{ smartAnimal thisSmartAnimal; dog thisDog; }

...我会在 中复制“东西” animal,例如,位置。我将不得不处理两组位置变量!以及 中的任何属性的副本animal

继承多个接口听起来也不是正确的解决方案,因为假设dog是一个接口,.sniff(),.poop().bark()的实现不应该改变和重新实现smartDog以及任何其他类

这里的最佳做法是什么?也就是说,有两个类dogsmartDog

编辑:

从一些评论/答案中,让我澄清一下。在我的具体项目中,asmartAnimal实际上有一个完整的神经网络来控制它。这是很多代码,将其抽象为接口是没有意义的。不管是什么动物,神经网络功能的核心都是一样的,但每个smartAnimal子类都会以不同的方式实现人工智能“大脑”的输出。相反,每只动物都有自己的功能,无论是人类控制它还是它自己的人工智能代理控制它,它们的功能都是一样的。

0 投票
3 回答
8699 浏览

c# - 正确实现两个具有不同类型但语义等价的对象的比较

我发现了一个类似的问题

如何比较具有相似属性的两个截然不同的对象

这可能会含蓄地和/或部分地回答我的问题。

假设我想比较(没有很多嵌套条件)这个对象:

到一个System.String。我只对平等不平等感兴趣(而不是关于身份的一系列价值观)。

实施IEquatable<string>ObjectA一个正确的选择吗?我不在乎什么简单有效,我想为这种情况确定正确的模式。

作为其他信息,请考虑ObjectA通常以IEnumerable<ObjectA>.

我不需要知道是否"string" ==!= objectA实例;不涉及排序。

编辑以澄清(和帮助)

对不起,写一个好问题有时很困难......

假设出于比较的目的我不能表示ObjectA为字符串(违反封装不是一种选择)。

  • 在 context-1 中,我必须将它与PropertyY.

  • 在上下文 2 中,我必须将其与应用于PropertyY/的算法相匹配PropertyZ

问题末尾的@Oliver解决方案再次帮助我(并再次+1)。我可以简单地定义一个自定义接口:

由于我也ObjectB具有相同的逻辑但不同的属性,因此两者都将实现IContextConverter或者我可能会找到更好的名称)避免违反RAP

0 投票
4 回答
779 浏览

c# - Is calling into other code a (SOLID) Single Responsibility Principles (SRP) violation?

Considering this class with business logic:

The class contains some business logic, and executes some crosscutting concerns as well. Although there is no doubt about that this class violates the Open/Closed Principle, does this class violate the Single Responsibility Principle?

I'm in doubt, since the class itself is not responsible for authorizing the user, for profiling the performance and for handling the transaction.

There is no question about this that this is poor design, since the class is still (statically) depending on those crosscutting concerns, but still: Is it violating the SRP. If so, why is this?

0 投票
6 回答
1740 浏览

c# - 在不创建新类的情况下添加更多行为

这是采访中被问到的问题。

有一个Label带有属性Text
的标签在一个页面中很简单Label,在其他页面中它可以处理以下任何一个或组合的操作
Clickable
Resizable
Draggable

你如何设计这个应用 OOP 设计原则和设计模式的标签组件?

我说我将创建以下内容:

这样如果客户想要 Resizable Label

同样的方式ClickableLableDraggableLabel

但是,我觉得这是不正确的做法,因为我不想添加那些具体的类。我想避免使用ClickableAndDraggableLabelor ClickableDraggableResizableLabel

是否有任何设计模式可以在不添加这些具体类的情况下解决这个问题?