Questions tagged «design»

有关通过软件设计解决问题和计划解决方案的问题。

7
是否可以在没有明显分支的情况下实施策略模式?
策略模式很好地避免了if ... else庞大的构造,并使添加或替换功能更加容易。但是,我认为这仍然存在一个缺陷。似乎在每个实现中仍然需要一个分支构造。它可能是工厂或数据文件。以订购系统为例。 厂: // All of these classes implement OrderStrategy switch (orderType) { case NEW_ORDER: return new NewOrder(); case CANCELLATION: return new Cancellation(); case RETURN: return new Return(); } 此后的代码无需担心,现在只有一个地方可以添加新的订单类型,但是此部分代码仍不可扩展。将其拉出到数据文件中有助于提高可读性(我知道这值得商bat): <strategies> <order type="NEW_ORDER">com.company.NewOrder</order> <order type="CANCELLATION">com.company.Cancellation</order> <order type="RETURN">com.company.Return</order> </strategies> 但这仍然增加了样板代码来处理数据文件-授予的,更容易进行单元测试和相对稳定的代码,但是仍然增加了复杂性。 而且,这种结构不能很好地进行集成测试。现在每个单独的策略可能更容易测试,但是您添加的每个新策略都增加了测试的复杂性。它比没有使用模式时要少,但是它仍然存在。 有没有办法实现减轻这种复杂性的战略模式?还是这只是简单而已,而尝试更进一步只会增加另一层抽象,却几乎没有好处?

5
您如何处理多方项目中的版本控制?
我知道这是一个广泛的问题,所以我将尽量具体。这个问题比技术性问题更像是一个“组织性”问题。 我们有一个包含以下主要组成部分的多面项目: 服务器,托管核心业务逻辑(数据模型) 使用核心业务逻辑的客户后台 也使用核心业务逻辑的应用程序API(REST) 有使用应用程序API的智能手机应用程序(iOS和android) 还有另一个平板电脑应用程序(android)与使用相同应用程序API的智能手机不同。 很快,我将在活跃的客户中投入生产。作为任何项目,我都需要随着时间的推移维护所有不同的组件。这意味着可以升级以下所有内容: 服务器中核心业务逻辑的代码(由后台,API使用,并且副作用是由移动应用程序使用) API本身(由智能手机和平板电脑应用程序使用) 所有移动应用(通过appstore / googleplay) 当然,服务器端部分(核心业务逻辑代码和API代码)可以由我自己立即更改。但是,客户端必须在appstore / googleplay上下载新的移动应用程序,而且我不确定它们是否是最新的。 您能否提供任何指导和良好操作技巧,以使这些升级顺利进行,并且对客户没有风险? 我需要“版本”的哪个组件?即使客户端不升级其移动应用程序,如何确保一切正常?我应该强迫他升级以简化工作吗? 简而言之,我应该如何组织才能使我的多面项目随着时间的推移而上线?

2
堆栈扩展LinkedList。是否违反了Liskov替代原则?
存在具有诸如add_first(),add_last(),add_after(),remove_first(),remove_last()和remove()之类的函数的LinkedList类。 现在有一个Stack类,提供了push(),pop(),peek()或top()等功能,并且为了实现这些方法,它扩展了LinkedList类方法。这是否违反了《里斯科夫替代原则》? 例如,考虑在add_after()情况下将节点添加到链接列表的第n个位置的情况。这可以在基类中完成,但不能在Stack类中完成。此处的后置条件是否已减弱,或者您是否修改add_after()方法以将其添加到堆栈顶部? 另外,如果不违反,这是不好的设计吗?以及如何使用LinkedList类实现Stack功能?

3
一个人应该如何管理多种语言的常量?
我遇到的情况是我在功能上支持多种语言的同一库。这些常量之间通常需要共享常量(例如,json字段名称键或错误代码)。 我目前这样做的方式是让代码定义每种语言的常量。 问题来自维护。如果添加新的错误代码,则需要在每个库中手动更新它。虽然这对几个人来说很好,但是如果我说要更新5个SDK,就变得很乏味。也有一个单一的真理来源真是太好了。 我已经考虑过某种类似config的文件,但是它需要包含在每个已部署的软件包中,这会增加我们的构建/发布过程的复杂性。 有没有更好的方法来处理在多种语言之间共享的常量的维护?
13 design  packages 

6
将对象映射到演示者的干净的OOP方法
我正在用Java创建一个棋盘游戏(例如国际象棋),其中每个棋子都是自己的类型(例如Pawn,Rook等等)。对于应用程序的GUI部分,我需要为每个这些部分提供一个图像。既然做的像 rook.image(); 违反了UI和业务逻辑的分离,我将为每个作品创建一个不同的演示者,然后将作品类型映射到其相应的演示者,例如 private HashMap<Class<Piece>, PiecePresenter> presenters = ... public Image getImage(Piece piece) { return presenters.get(piece.getClass()).image(); } 到目前为止,一切都很好。但是,我认为谨慎的OOP专家在调用getClass()方法时会皱眉,并建议像这样使用访客: class Rook extends Piece { @Override public <T> T accept(PieceVisitor<T> visitor) { return visitor.visitRook(this); } } class ImageVisitor implements PieceVisitor<Image> { @Override public Image visitRook(Rook rook) { return rookImage; } } 我喜欢这种解决方案(谢谢您,老师),但是它有一个明显的缺点。每次将新的样片类型添加到应用程序时,都需要使用新的方法来更新PieceVisitor。我想将我的系统用作棋盘游戏框架,可以通过一个简单的过程添加新作品,其中框架的用户只能提供作品及其演示者的实现,并将其插入框架中即可。我的问题:是否有没有等等的干净的OOP解决方案instanceof,getClass()它将允许这种可扩展性?

8
Scrum团队不遵循YAGNI原则
在SCRUM会议上,产品团队讨论了移动应用程序将使用的API功能。我们进行了一次模拟,显示了屏幕的外观以及屏幕应包含的关键元素(“布局”)。 基于此以及与产品所有者的讨论,我创建了API响应(HAL + JSON)的原型。这是非常简单的,符合HAL规范的JSON,仅能代表模型中的内容而已。我没有受到商人所预见的未来想法的影响,因为他们倾向于经常改变他们的想法,因此我决定采用简约的方法。我的提议被团队拒绝,而我的提议以7比1胜负。 团队决定使用更复杂的,非语义的抽象json结构,该结构允许在布局布局中提供更大的灵活性。这种方法的缺点是我们最终得到了一组统一的对象,这些对象在设计上可能具有null和empty属性。他们还认为最好进行A / B测试,但这只是基于他们的预测,因为我们没有这样的要求。 大多数时候,我们都在争论那些不是冲刺的一部分,也不是在样机上提到的东西。所描述的问题是“未来的市场营销将如何……”,“企业可能希望我们...如何”。 我和产品负责人都是经验丰富的程序员,我们过去已经看到过这类问题。我们尝试遵循YAGNI和KISS原则。团队的其他成员经验不足,尽管他们了解这些原则,但似乎并不了解它们。 我们同意他们的解决方案,因为整个团队对我们来说更重要,我们不想为那些不那么重要的事情而战。但是我担心这样的事情是否会成为即将来临的,更复杂的辩论的先例?如何应对这种行为?作为团队负责人,我有什么可以做得更好的? 值得一提的是,该产品是早期MVP。

3
由于什么原因,您会为Swift中的每个委托使用单独的类扩展?
我正在阅读Ray Wenderlich教程,并且注意到作者使用类扩展来保存委托回调,而不是让它们在类本身中进行处理,即: 类扩展内的委托回调: extension LogsViewController : UIPopoverPresentationControllerDelegate { func adaptivePresentationStyleForPresentationController(controller: UIPresentationController, traitCollection: UITraitCollection) -> UIModalPresentationStyle { ... } } 而不是将其包含在类中: 在类内委托回调: class LogsViewController : UITableViewController, UIPopoverPresentationControllerDelegate { func adaptivePresentationStyleForPresentationController(controller: UIPresentationController, traitCollection: UITraitCollection) -> UIModalPresentationStyle { ... } } 我同时发现这很奇怪也很有趣。他有一个专门用于LogsViewController类的扩展的文件,名为“ LogsViewControllerExtension.swift”,并且每个委托协议都有一个不同的扩展名:UITableViewDataSource,UISplitViewDelegate等,即: 多个类扩展,每个都有自己的文件中的委托回调: extension LogsViewController: UISplitViewControllerDelegate { ... callbacks } extension LogsViewController …

3
在某些情况下如何引起程序员的注意?
让我们从一个例子开始。 比方说,我有一个称为方法export,该方法在很大程度上取决于数据库架构。“严重依赖”是指我知道(经常)向特定表中添加新列会导致相应的export方法更改(通常也应将新字段也添加到导出数据中)。 程序员通常会忘记更改export方法,因为还不清楚您是否应该看一下。我的目标是迫使程序员明确决定是否要忘记查看该export方法还是只是不想在导出数据中添加字段。我正在寻找针对此问题的设计解决方案。 我有两个想法,但它们都有缺陷。 智能的“阅读所有”包装 我可以创建智能包装器,以确保显式读取所有数据。 像这样: def export(): checker = AllReadChecker.new(table_row) name = checker.get('name') surname = checker.get('surname') checker.ignore('age') # explicitly ignore the "age" field result = [name, surname] # or whatever checker.check_now() # check all is read return result 因此,checker断言if是否table_row包含另一个未读取的字段。但是,所有这些东西看起来有点沉重,并且(可能)会影响性能。 “检查该方法”单元测试 我可以创建一个能够记住最后一个表模式的单元测试,并且每次更改表时都会失败。在那种情况下,程序员会看到类似“不要忘了检查export方法”的信息。要隐藏警告程序员,可以(或不会-这是一个问题)签出export并手动(这是另一个问题)通过在其中添加新字段来修复测试。 我还有其他一些想法,但是它们太难实现或难以理解(我不希望该项目成为难题)。 上面的问题只是我不时遇到的更多问题的一个示例。我想绑定一些代码和/或基础结构,因此更改其中的一个代码会立即提醒程序员检查另一个代码和/或基础结构。通常,您有一些简单的工具,例如提取通用逻辑或编写可靠的单元测试,但是我正在寻找更复杂情况的工具:也许我现在知道一些设计模式。

5
如何进行一项测试取决于另一项测试的结果?
假设有一个实用程序类,提供了许多其他类在代码中各处使用的一些常见静态方法。 您将如何为实用程序的使用者设计单元测试,以便在任何一项实用程序测试未通过的情况下使他们的测试失败?您可以这样做还是必须自己检查实用程序类测试是否全部为绿色? 例如,我有一个消息拆分器实用程序,它由消息解析器使用(或更确切地说,它的输出)。我想确保在测试邮件解析器之前,邮件拆分器能够正常工作。 我已经为它们两个编写了测试,但是有没有办法链接它们并使一个测试依赖于其他测试的结果? 我找不到适合的标签,但是我使用的是Visual Studio的单元测试引擎。

3
如何使参数保持低计数并仍保持第三方依存关系独立?
我使用第三方图书馆。他们向我传递了一个POJO,出于我们的意图和目的,可能是这样实现的: public class OurData { private String foo; private String bar; private String baz; private String quux; // A lot more than this // IMPORTANT: NOTE THAT THIS IS A PACKAGE PRIVATE CONSTRUCTOR OurData(/* I don't know what they do */) { // some stuff } public String getFoo() { …

4
Rails:德米特混乱法则
我正在阅读一本名为《 Rails反模式》的书,他们谈论使用委派来避免违反Demeter法则。这是他们的主要例子: 他们认为在控制器中调用这样的命令是不好的(我同意) @street = @invoice.customer.address.street 他们提出的解决方案是执行以下操作: class Customer has_one :address belongs_to :invoice def street address.street end end class Invoice has_one :customer def customer_street customer.street end end @street = @invoice.customer_street 他们说,由于您仅使用一个点,因此您没有违反Demeter定律。我认为这是不正确的,因为您仍在通过客户通过地址来获取发票的街道。我主要是从我读过的博客文章中得到这个想法的: http://www.dan-manges.com/blog/37 在博客文章中,主要的例子是 class Wallet attr_accessor :cash end class Customer has_one :wallet # attribute delegation def cash @wallet.cash end end …

5
什么时候应该比从文本文件解析数据优先使用数据库?
我正在制作一个Python程序来测量codereview.SE的增长。我的方法是获取首页上显示的“网站统计信息”,并将其存储在我的硬盘上。我计划每天执行一次。到目前为止,我已经做了足够的工作来获取统计数据并将它们附加到文本文件中。可以在github上查看python脚本。我使用的格式如下 22-08-2013 questions 9073 answers 15326 answered 88 users 26102 visitors/day 7407 22-08-2013 questions 9073 answers 15326 answered 88 users 26102 visitors/day 7407 我只运行了两次脚本,以获取文件中要使用的格式。最初,这对我来说似乎很好,因为我可以自己存储它,而且格式是相同的,因此很容易解析,但是不确定。似乎在这里使用数据库应该更好,因为那样检索数据应该更容易。请注意,我从未使用过任何数据库,也不了解SQL,MySQL或RDBMS的任何其他变体。 因此,这使我想到了这个问题。什么时候应该首选数据库来存储数据而不是将数据存储在文本文件中?在决定是否需要数据库还是简单的文本文件时,是否可以找到一些指针? PS:如果可以添加更好的标签,请这样做。我对可以添加的标签有些怀疑。

4
这些特定的表是否需要代理键?
背景 我有这张桌子 +-------------------------+ +------------------------+ |Airport | |Country | |-------------------------| |------------------------| |airport_code string (PK) | |country_code string (PK)| |address string | |name string | |name string | +------------------------+ +-------------------------+ +-------------------------+ |Currency | |-------------------------| |currency_code string (PK)| |name string | +-------------------------+ airport_code是IATA(国际航空运输协会)的 机场代码,乘飞机旅行时,您可以在行李标签中看到它们。 country_code是ISO 3166-1 A3标准国家/地区代码,您可以在奥运会上查看它们。 currency_code是IS0 417标准的3个字符的货币代码,您可以在国际货币兑换显示板上看到它们。 问题 这些自然PK是否足够好? 是否使用世界公认的标准,而整个行业都接受了PK的标准? 这张桌子是否需要代孕品?


2
通过类构造所有代码并编译为类(如Java)的优缺点
编辑:与Java不同,我的语言允许多重继承。 我已经开始设计和开发自己的编程语言,用于教育,娱乐和可能有用的目的。 首先,我决定将其基于Java。 这意味着所有代码都将以类的形式编写,并且代码会编译为类,这些类由VM加载。 但是,我排除了诸如接口和抽象类之类的功能,因为我发现不需要它们。他们似乎在强制范式,我希望我的语言不要这样做。但我想将这些类保留为编译单元,因为实现起来似乎很方便,熟悉,而且我只是喜欢这个想法。 然后,我注意到我基本上只剩下一个模块系统,在该系统中,类可以用作“命名空间”,使用static指令提供常量和函数,或用作需要实例化的对象的模板(类的“实际”目的)其他语言)。 现在我不禁要问:将类用作编译单元有什么好处和坏处? 另外,对于我的设计的任何一般性评论也将不胜感激。可以在以下网站找到有关我的语言的丰富信息:http : //www.yannbane.com/2012/12/kava.html。

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.