Questions tagged «design-patterns»

设计模式是解决软件设计中常见问题的通用可重用解决方案。

4
软件体系结构在多大程度上取决于语言?
在向我介绍软件体系结构和设计模式时,我注意到在大多数情况下,解释中都隐含了某些语言功能和设计细节。 例如,几乎任何文章或书籍都将使用类和接口来说明思想。在该主题上可以轻松找到的所有内容都会提到对象和OOP概念。 如果编写系统的语言根本没有这样的概念怎么办?例如,如果我使用动态类型且没有接口概念的Python或Node,该怎么办?如果我在接口是短暂构造(在运行时中不存在)的情况下使用TypeScript怎么办?如果我尝试使用函数式编程该怎么办?我应该忽略例如SOLID并寻找其他适合我的语言的概念吗? 如果是,那是什么?不幸的是,据我所知,所有公认的范例都以某种方式引用了OOP概念和类型。如果没有,那么在将通用的体系结构和设计原则适应我的特定语言和用例时应该遵循哪些规则? 您一般如何描述体系结构和语言之间的依赖关系?

4
在多态性的背景下,如何处理为子类型添加的方法?
当使用多态性的概念时,您将创建一个类层次结构,并使用父代引用来调用接口函数,而无需知道对象具有哪种特定类型。这很棒。例: 您有动物的集合,并且可以调用所有动物的功能,eat而不必关心它是吃狗还是猫。但是在同一个类层次结构中,您的动物除了从类继承和实现Animal(例如makeEggs,getBackFromTheFreezedState等等)外,还具有其他动物。因此,在某些情况下,您可能需要了解调用其他行为的特定类型。 例如,如果是早晨,如果它只是一只动物,那么您可以致电eat;否则,如果是人类,那么请首先致电washHands,getDressed然后再致电eat。如何处理这种情况?多态性死亡。您需要找出对象的类型,这听起来像是代码气味。是否有处理这种情况的通用方法?


7
如何从客户端应用程序构建用户身份验证?
我一直在开发将支持许多用户的应用程序。问题是我不知道如何验证客户端/用户。 我正在构建一个http://quickblox.com/之类的应用程序,在该应用程序中我将向用户提供凭据,他们将使用这些凭据来构建N个应用程序,在这些应用程序中,他们无法输入用户名和密码来进行身份验证。 让我们假设它如下。(就像QuickBlox一样) 1.用户在我的网站上创建帐户。 2.用户可以创建N个API密钥和保密凭证。(对于多个应用程序) 3.用户将在其应用程序(Android,iOS,Javascript等)中使用这些凭据与我的REST API进行通信。(REST API具有读写访问权限。) 我的顾虑? 用户会将其凭据(API密钥和秘密密钥)放入他们构建的应用程序中,如果有人获得了这些密钥并尝试模仿用户该怎么办?(通过反编译APK或直接查看JavaScript代码。 我在某处错了吗?我对构建这种三级用户机制感到困惑。

4
算法模式,在需要时输出对如何到达解决方案的解释
以下情况发生在我身上几次。 我编写了解决特定问题的算法。它工作正常,并找到正确的解决方案。现在,我希望有一个选项可以告诉算法“写出有关如何获得解决方案的完整说明”。我的目标是能够在在线演示,教程课程等中使用该算法。我仍然希望有一个选项可以实时运行算法,而无需解释。什么是好的设计模式? 示例:假设我实现了用于找到最大公约数的方法。当前实现的方法返回正确答案,但没有解释。我想为该方法提供一个选项来解释其操作,例如: Initially, a=6 and b=4. The number of 2-factors, d, is initialized to 0. a and b are both even, so we divide them by 2 and increment d by 1. Now, a=3 and b=2. a is odd but b is even, so we divide b by 2. …

4
单一职责模式对班级应该有多具体?
例如,假设您有一个控制台游戏程序,该程序具有往返于控制台的各种输入/输出方法。难道是聪明的,让他们在一个单一inputOutput类或把它们分解到更具体的类,如startMenuIO,inGameIO,playerIO,gameBoardIO,等使得每个班大约有1-5的方法呢? 同时,如果最好将它们分解,将它们放置在IO命名空间中是否明智,从而使它们更冗长,例如:IO.inGame等?

4
正确的Model-View -_____设计
我一直在阅读有关Model View Controller,Model View Presenter,Model View ViewModel等的内容,通常,基本概念似乎很容易理解:将漂亮的视觉效果和科学胆量保持彼此独立和无知,例如可能。设计巧克力中没有添加逻辑花生酱;酷,我喜欢。 问题是我对于第三部分还是有点模糊,不是模型或视图。每个人似乎都有自己的主意,如何称呼它,应该做什么,什么是正确的,什么是明显的错误……而且我很想弄清楚什么时候Presenter成为ViewModel,什么时候应该让View成为现实。不要这样做,因为那是主持人的工作,并且- 我在乱逛 而不是请别人解释它们之间的区别-因为已经一次又一次地做到了(我知道;我读了不计其数的文章)-我很好奇听到我自己拼凑的模型很少有程序员。 就是说,您会将此设计归类为什么?也许更重要的是,您是否对此有明显的印象?当然,如果这确实是可靠的设计,我很想听到我做的很好,但是我宁愿得到可靠的建议而不是赞美。 注意:我将使用“桥梁”作为Model-View-?的神秘第三部分。避免对其“应该”有任何潜意识的建议。 模型 是对数据的授权。 从网桥接收有关请求的更改的信息。 包含并执行关于数据如何与其他数据相关的所有逻辑。 数据更改时通知网桥(对于网桥表示感兴趣的数据)。文字编辑:允许外部订户(对其一无所知)监视其状态或计算结果。 对视图的知识为零。 视图 与为用户提供查看和操纵数据的方式有关。 从网桥接收有关数据更新的信息。 包含并执行有关如何向用户呈现数据和控件的所有逻辑。 当用户执行了(可能)影响模型的操作时,通知Bridge。 通知Bridge感兴趣的信息。 对模型的知识为零。 桥 是模型和视图之间的协调者和翻译者。 对在模型和视图之间传递的信息进行适当的格式更改。 保留有关“谁需要知道什么”的信息。 具有模型和视图的知识。 补充说明 在更复杂的程序中,通常会有多个模型。在这种情况下,网桥通常承担在多个模型之间进行协调/转换的工作,因此成为应将原型/ API /设计模型构建到哪个模型的权限。(例如,如果构建纸牌游戏程序,并且您要构建备用的甲板改组模型,则应使用Bridge来确定与Bridge正确通信所需的功能。) 在只有一个视图和模型的小型简单程序中,网桥通常会“假定”任一侧都有哪些功能。但是,随着程序变得越来越复杂,建议视图和模型向Bridge报告其功能,这样可以避免效率低下和错误的假设。 我认为这几乎涵盖了它。无论如何,我欢迎您对我倾向于使用的设计有任何疑问,并且我也鼓励您提出任何建议。 和往常一样,感谢您的宝贵时间。

4
是否可以将应用程序宽松地耦合到其框架?
假设我正在开发一个Web应用程序。我的首选是将PHP与无脂肪框架(F3)和MVC模式结合使用。明年,我可能会决定我要切换到Zend Framework,或者甚至是ASP.NET MVC。尝试以松散耦合到其框架的方式设计应用程序是否有意义,或者该框架是否过于完整以至于无法实现这一目标? 我问的唯一原因是因为它最近与一位同行进行了交谈,这位同行批评我的派是将应用程序与F3松散耦合的想法。

4
用于将各种源类型和各种目标类型导入数据的设计模式
我必须设计和构建可以处理以下内容的导入脚本(在C#中): 从各种来源(XML,XSLX,CSV)读取数据 验证数据 将数据写入各种对象类型(客户,地址) 数据将来自多个来源,但一个来源将始终具有一种导入格式(csv,xml,xslx)。导入格式因来源而异。将来可能会添加新的导入格式。目标对象类型始终相同(客户,地址和其他)。 我一直在考虑使用泛型,并且阅读了一些有关工厂模式的信息,但是我在这个领域非常菜鸟,所以任何建议都值得欢迎。 解决该问题的合适设计模式是什么?

1
我们使用存储库模式正确吗?
我们正在使用一堆带有后缀的独立类,-repository以从数据库中检索数据。每个表都有自己的存储库。 例如,我们有一个customerrepository具有各种方法来检索客户的类,并且具有一个vacancyrepository具有各种方法来检索空缺的类。 关于这种做事方式,我有两个问题: 如何获取跨越多个表的数据?例如,我有一个屏幕,显示所有尚未创建空缺的客户。可以customerrepository从中使用方法vacancyrespository,还是两个存储库都返回结果,并且层次结构中是否有更高的类(我们将其命名为a dataservice)从两个存储库中获取结果并将它们合并为1个结果? 这样的存储库可以处理多少逻辑? 我认为可以在存储库中实现“ where active == true”以仅检索活动记录,还是应该由层次结构中较高的类来处理简单的逻辑(将其命名为a dataservice)? 我现在遇到的示例是以下示例: 我们有一个问题列表,其中包含一个或多个问题。 问题可以有一个结果,该结果保存在单独的表中。 因此,当您要检索问题列表的总结果时,必须合并questionlist表,问题表和questionstatus表中的数据。 现在,我们为这些表提供3个不同的存储库。 如果我要问questionlistrepository清单12的总结果是什么,那将不得不从另外两个存储库中获取数据,因此其中有些逻辑,这是允许的吗? 还是有questionlistdataservice哪个知道要使用哪个存储库? 还有一件事:我们的存储库可以生成一个结果,IQueryable以便调用服务可以轻松地合并结果,但是如果不是这种情况,我认为从列表中检索所有三个表的所有内容不是一个好主意。数据库。

2
如何使ASP.NET MVC网站模块化
我正在计划用ASP.NET MVC 4构建的员工Intranet系统。我们希望该站点由单独的“模块”组成,每个模块都提供不同的功能:消息传递,薪资变更等我希望这些模块能够在编译时启用或禁用。主页将显示某种导航,该导航将链接到所加载的每个模块。 到目前为止,这很容易,但是我不希望导航功能必须事先了解模块。换句话说,我希望模块是动态可发现的。我希望能够为新模块编写代码,然后将链接添加到导航栏中,而源代码中其他任何地方都没有代码更改。每个模块都应该有某种向导航栏注册的方式,更重要的是,每个模块在加载时都应完成此操作。 我认为这排除了使用MVC的区域的能力,因为这些区域是针对事先知道站点布局的情况而设计的。尽管人们似乎已经成功地将MEF与MVC相结合,但MEF似乎是适当的。MEF实际上是到达这里的方法,还是有更好的方法来完成我需要的工作?

4
将模板方法与策略相结合
我的软件工程课上的一项作业是设计一个可以玩不同形式的特定应用程序的应用程序。有问题的游戏是Mancala,其中一些游戏称为Wari或Kalah。这些游戏在某些方面有所不同,但对于我来说,重要的是要知道这些游戏可能在以下方面有所不同: 移动结果的处理方式 确定游戏结束的方式 确定获奖者的方式 设计该功能的第一件事是使用策略模式,我在算法(游戏的实际规则)上有所不同。设计看起来像这样: 然后我对自己想,在Mancala和Wari的游戏中,确定获胜者的方式是完全相同的,并且代码会重复。我不认为这从定义上讲违反了“一条规则,一个地方”或DRY原则,因为Mancala规则的变化不会自动意味着在Wari中也应更改规则。然而,从我教授的反馈中,我印象深刻地找到了另一种设计。 然后我想到了这个: 每个游戏(Mancala,Wari,Kalah等)都将具有每个规则界面类型的属性,即WinnerDeterminer,如果有Mancala 2.0版本与Mancala 1.0相同,除了如何确定获胜者之外,使用Mancala版本。 我认为将这些规则作为策略模式实施当然是有效的。但是,当我想进一步设计时,真正的问题就来了。 在阅读有关模板方法模式的信息时,我立即认为它可以应用于此问题。用户进行移动时所执行的操作始终相同,并且顺序相同,即: 在洞中放石头(所有游戏都一样,因此将在模板方法本身中实现) 确定举动的结果 确定游戏是否由于上一步而结束 如果游戏结束,确定谁赢了 最后三个步骤全部属于上述我的策略模式。合并这两项时,我遇到很多麻烦。我发现一种可能的解决方案是放弃策略模式并执行以下操作: 我真的没有看到策略模式与此之间的设计差异吗?但是我确定我需要使用模板方法(尽管我可以肯定必须使用策略模式)。 我也无法确定谁将负责创建TurnTemplate对象,但是使用策略模式,我觉得我拥有对象族(三个规则),可以使用抽象工厂模式轻松创建对象族。然后MancalaRuleFactory,我将拥有一个,WariRuleFactory等等,他们将创建规则的正确实例并将其交给我RuleSet。 假设我使用了策略+抽象工厂模式,并且我有一个RuleSet对象,其中包含用于这三个规则的算法。我觉得仍然可以使用模板方法模式的唯一方法是将此RuleSet对象传递给我TurnTemplate。然后出现的“问题”是,我永远不需要的具体实现TurnTemplate,这些类将变得过时。在我受保护的方法中,TurnTemplate我可以调用ruleSet.determineWinner()。结果,TurnTemplate该类将不再是抽象的,而是必须变得具体,那么它仍然是模板方法模式吗? 总而言之,我是在以正确的方式思考还是在错过简单的东西?如果我处在正确的轨道上,如何将策略模式和模板方法模式结合在一起?

3
您如何分辨是使用复合模式还是树结构,还是第三个实现?
我有两种客户端类型,即“ 观察者 ”类型和“ 主题 ”类型。它们都与组的层次结构相关联。 观察者将从不同层次中与其关联的组中接收(日历)数据。通过合并尝试收集数据的组的“父”组中的数据(每个组只能有一个父组)来计算此数据。 主题将能够在与其关联的组中创建数据(观察者将接收)。当在一个组中创建数据时,该组的所有“子级”也将拥有该数据,他们将能够为数据的特定区域制作自己的版本,但仍链接到创建的原始数据(在在我的特定实现中,原始数据将包含时间段和标题,而子组则为直接链接到其各自组的接收者指定其余数据。 但是,当主体创建数据时,必须检查所有受影响的观察者是否有与此冲突的数据,据我所知,这意味着庞大的递归功能。 因此,我认为这可以归纳为以下事实:我需要具有一个可以在其中上下移动的层次结构,并且某些地方必须能够将它们作为一个整体来对待(基本上是递归)。 另外,我不仅针对可行的解决方案。我希望找到一种相对容易理解的解决方案(至少在体系结构方面),并且足够灵活,以便将来能够轻松接收其他功能。 是否有解决此问题或类似层次结构问题的设计模式或良好实践? 编辑: 这是我的设计: “ Phoenix”类以这种方式命名,因为我还没有想到合适的名称。 但是除此之外,我需要能够为特定的观察者隐藏特定的活动,即使这些活动通过组与之相连。 有点题外话: 就我个人而言,我认为我应该可以将这个问题分解为较小的问题,但这使我无所适从。我认为这是因为它涉及多个相互不关联的递归功能,以及需要以不同方式获取信息的不同客户端类型。我真的不能把头缠住它。如果有人能指导我如何更好地封装层次结构问题,我也将很高兴收到这一消息。

9
如何拆分紧密联系的大型课程?
我有一些巨大的类,它们包含超过2k行代码(并且还在不断增长),如果可能的话,我希望对其进行重构,以实现更加轻巧和简洁的设计。 它之所以如此之大,主要是因为这些类处理大多数方法都需要访问的一组映射,并且方法之间相互联系紧密。 我将举一个非常具体的示例:我有一个名为的类Server来处理传入消息。它有类似的方法joinChatroom,searchUsers,sendPrivateMessage等所有这些方法操纵映射,如users,chatrooms,servers,... 如果我可以有一个类来处理有关Chatrooms的消息,另一个可以处理所有有关Users的消息,等等,这也许会很好,但是这里的主要问题是我需要在大多数方法中使用所有地图。因此,Server由于它们都依赖于这些通用映射,并且方法之间相互联系紧密,因此它们现在都属于该类。 我需要创建一个类Chatrooms,但要引用其他每个对象。类的用户再次引用所有其他对象,等等。 我觉得我做错了什么。

8
MVC是否仅适用于Web
每当我与开发人员谈论Model View Controller(MVC)时,它们几乎是瞬间的,他们说您向URL发出请求,服务器将建立一个实体(MODEL),并为您提供该模型的可视化表示。 那么这是否意味着MVC 仅适用于Web,或者我是否正在和只是使用MVC编写Web应用程序的开发人员见面? 桌面样式应用程序上有MVC的用法吗? 我是范式的新手,我想知道MVC的任何超集

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.