Questions tagged «design-patterns»

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

4
在使用不可变对象时,是否有一种特定的设计策略可用于解决大多数“鸡与蛋”问题?
来自OOP背景(Java),我自己学习Scala。虽然我很容易看到单独使用不可变对象的优点,但我很难理解如何设计这样的整个应用程序。我举一个例子: 假设我有代表“材料”及其属性的对象(我在设计游戏,所以我实际上确实有这个问题),例如水和冰。我将拥有一个拥有所有此类材料实例的“经理”。一种特性是凝固点和熔点,以及材料冻结或融化的温度。 [编辑]所有的实例都是“单例”,有点像Java枚举。 我想让“水”说在0C时冻结成“冰”,而“冰”说在1C时熔化成“水”。但是,如果水和冰是不可变的,则它们不能作为构造函数参数相互引用,因为其中一个必须首先创建,并且不能将尚未存在的另一个作为构造函数参数进行引用。我可以通过给他们两个都提供给经理的参考来解决这个问题,以便他们每次查询冻结/融化属性时都可以查询它以找到他们需要的其他材料实例,但是随后经理之间也遇到了同样的问题和材料,它们需要相互引用,但是只能在构造函数中为它们之一提供引用,因此管理器或材料不能是不变的。 他们只是无法解决这个问题,还是我需要使用“功能”编程技术或其他某种模式来解决它?

8
“您将不需要它”和“现在总比没有好”如何一起玩?
当我提高设计的干燥度时,我经常发现自己拥抱“现在比没有更好”。通常,我发现我需要在其他知识体系的背景下,对一种知识建立对一个权威位置的理解。因此,我倾向于将系统设计为“现在”。 相反,尽管有一定的机会我不需要它,但这种做法仍使我提前建立了。 这两种模式如何相符? 您使用什么方法来确保它们表现良好? 您如何一起教他们又不引起混乱?

6
如何为多态类创建GUI?
假设我有一个测试构建器,以便老师可以为测试创建很多问题。 但是,并非所有问题都相同:您有多项选择,文本框,匹配项等等。这些问题类型中的每一个都需要存储不同类型的数据,并且对于创建者和应试者都需要不同的GUI。 我想避免两件事: 类型检查或类型转换 我的数据代码中与GUI有关的所有内容。 在最初的尝试中,我最终获得了以下课程: class Test{ List<Question> questions; } interface Question { } class MultipleChoice implements Question {} class TextBox implements Question {} 但是,当我去显示测试时,我不可避免地会得到如下代码: for (Question question: questions){ if (question instanceof MultipleChoice){ display.add(new MultipleChoiceViewer()); } //etc } 这感觉像是一个非常普遍的问题。是否有一些设计模式可以让我在避免上面列出的项目的同时提出多态性问题?还是多态性首先是错误的想法?

6
枚举什么时候不是代码气味?
困境 我已经阅读了很多有关面向对象实践的最佳实践书籍,几乎我读过的每一本书都有一部分内容,他们说枚举是一种代码味道。我认为他们已经错过了解释枚举何时有效的部分。 因此,我正在寻找准则和/或用例,其中枚举不是代码的味道,而实际上是有效的构造。 资料来源: “根据经验,枚举是代码的味道,应将其重构为多态类。[8]” Seemann,Mark,依赖注入,.Net,2011年,第2页。342 [8] Martin Fowler等人,《重构:改进现有代码的设计》(纽约:Addison-Wesley,1999年),第82页。 语境 我陷入困境的原因是交易API。通过以下方法,他们给了我Tick数据流: void TickPrice(TickType tickType, double value) 哪里 enum TickType { BuyPrice, BuyQuantity, LastPrice, LastQuantity, ... } 我尝试过围绕该API进行包装,因为打破更改是该API的生活方式。我想跟踪包装器上最后收到的刻度线类型的值,并且通过使用ticktypes字典来做到这一点: Dictionary<TickType,double> LastValues 在我看来,如果将它们用作键,这似乎是对枚举的正确使用。但是我有第二个想法,因为我确实有一个地方可以根据这个集合做出决定,而且我想不出一种消除消除switch语句的方法,我可以使用一个工厂,但是那个工厂仍然会有一个在某处切换语句。在我看来,我只是在移动东西,但仍然闻起来。 找到枚举的不容易,但是要做到的却不那么容易,如果人们可以分享他们的专业知识,利弊,我将不胜感激。 第二个想法 有些决定和行动是基于这些决定和行动的TickType,我似乎想不出消除枚举/切换语句的方法。我能想到的最干净的解决方案是使用工厂并返回基于的实现TickType。即使那样,我仍然会有一个switch语句,该语句返回接口的实现。 下面列出的是示例类之一,在其中我怀疑自己可能使用的枚举错误: public class ExecutionSimulator { Dictionary<TickType, double> LastReceived; void ProcessTick(TickType tickType, double value) { //Store Last Received …

4
Java-拥有完全静态的类是一个坏主意吗?
我正在一个更大的单独项目中工作,并且现在有几个类,在这些类中我看不到创建其实例的任何理由。 例如,我现在的骰子类静态地存储其所有数据,并且其所有方法也都是静态的。我不需要初始化它,因为当我想掷骰子并获得新值时,我只是使用Dice.roll()。 我有几个类似的类,它们只有一个这样的主要功能,我将开始研究一种“控制器”类,它将负责所有事件(例如,玩家移动时以及当前的转弯方向)是的),而且我发现我可以针对这一堂课遵循相同的想法。我从来没有打算为这些特定的类创建多个对象,因此使它们完全静态将是一个坏主意吗? 我想知道当涉及到Java时,这是否被视为“不好的做法”。从我所看到的,社区似乎在这个话题上有些分歧?无论如何,我希望对此进行一些讨论,并且与资源的链接也很棒!

4
无法掌握编程设计模式
在过去的4年中,我一直在使用javascript。我对解决问题的能力非常有信心,并且可以看到我的代码质量正在提高。我尝试与社区保持同步,目前正在使用ES2015和React.js。但是,我觉得我根本无法掌握编程设计模式。我知道在哪里可以找到有关此资源的信息,并且我已经阅读了有关它的书籍。我依靠我的高级同事来制定项目结构的决策,但是我对此工作没有任何疑问。 每当我需要自己开始做某事时,我都会寻找这两个路径:如果我使用的是像React.js这样的大型库/框架,我倾向于复制社区正在做的事情;如果使用较小的模块,则将使用模块模式。我知道,一旦我对这个问题有了更好的理解,我就能做出更好的决定,但是现在我已经完全迷失了。 我应该为此寻求高级教育吗?我需要这个主题的导师吗?我只是愚蠢吗?这真的很难理解吗?

1
了解访客模式
我有一个代表GUI控件的类层次结构。像这样: Control->ContainerControl->Form 我必须实现一系列算法,这些算法可以与处理各种任务的对象一起使用,并且我认为“访客”模式将是最干净的解决方案。让我们举个例子,该算法创建对象层次结构的Xml表示。使用“经典”方法,我可以这样做: public abstract class Control { public virtual XmlElement ToXML(XmlDocument document) { XmlElement xml = document.CreateElement(this.GetType().Name); // Create element, fill it with attributes declared with control return xml; } } public abstract class ContainerControl : Control { public override XmlElement ToXML(XmlDocument document) { XmlElement xml = base.ToXML(document); // …

2
对现代C ++范例的最佳概述?[关闭]
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,使它成为软件工程堆栈交换的主题。 4年前关闭。 我曾经在8到10年前广泛地编写C ++。从那以后,出于专业原因,我开始使用C#。但是,我有时会看到类似 “如果您仍在手动跟踪指针引用,那么您做错了” 要么 “只要您使用的是RAII之类的现代概念,并且不像正在恢复的C开发人员那样手动分配内存,C ++绝对是安全的。” 两者都是十年前的标准程序。我已经看到,最近C ++有了很大的改进。特别是C ++ 0x似乎具有一些新功能。对于“ C / old C ++”程序员来说,赶上“现代” C ++模式和实践的最佳资源是什么?

14
我如何解释继承的用处?[关闭]
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案会得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 6年前关闭。 当试图解释OOP中的继承概念时,常见的例子通常是哺乳动物。恕我直言,这确实是一个不好的例子,因为它将导致新手以错误的方式使用此概念。而且,他们在日常设计工作中将面临的不是常见的设计。 那么,使用继承解决的一个好,简单而具体的问题是什么?

2
每个.NET人员应该知道哪些主要实践和设计模式?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引文回答。 4年前关闭。 在作为专业程序员的短暂时间内,我看到了许多由程序员编写的应用程序,他们的整个学历似乎都在阅读.NET 2.0书中的前几章。 当我开始的时候,我写了大部分的应用程序! 对编写AWESOME .NET应用程序至关重要的最大设计模式是什么? 太棒了,我的意思是在里面!

4
什么是基于模式的编程?
有人可以解释编程中对模式和反模式的痴迷吗?我问是因为我完全不知道任何模式的含义。面对编程任务时,我会稍微考虑一下该问题,写下一些我认为相关的数据结构,为解决方案提供原型,分离出一些模块并进行迭代。在此过程中,我认为“哦,我这里需要FunkyLookyTastic模式”无处不在。

10
GoF设计模式-您实际使用哪些模式?[关闭]
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案会得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 7年前关闭。 我正在尝试对设计模式领域的同事进行教育。最初的“四人一组”模式有些神秘,所以我想知道是否有所有程序员都应该知道的“基本”模式子集。当我浏览列表时,我想我可能已经使用过- 抽象工厂 工厂方法 辛格尔顿 桥 正面 命令 您实际上在实践中使用了哪些?您将它们用于什么? 链接给那些想要模式列表的人

3
学习设计模式的推荐顺序?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引文回答。 6年前关闭。 我不禁注意到那里存在的设计模式数量。 有人对我应该学习的订单有建议吗?还是我应该随机选择它们? 到目前为止,我唯一知道的是单例。

4
注入依赖关系应该在ctor中还是在每个方法中完成?
考虑: public class CtorInjectionExample { public CtorInjectionExample(ISomeRepository SomeRepositoryIn, IOtherRepository OtherRepositoryIn) { this._someRepository = SomeRepositoryIn; this._otherRepository = OtherRepositoryIn; } public void SomeMethod() { //use this._someRepository } public void OtherMethod() { //use this._otherRepository } } 反对: public class MethodInjectionExample { public MethodInjectionExample() { } public void SomeMethod(ISomeRepository SomeRepositoryIn) { //use SomeRepositoryIn } …

4
OOP应用程序中的参数管理
我正在用C ++编写一个中等大小的OOP应用程序,作为实践OOP原理的一种方法。 我的项目中有几个类,其中一些需要访问运行时配置参数。这些参数是在应用程序启动期间从多个来源读取的。有些是从用户home-dir中的配置文件读取的,有些是命令行参数(argv)。 所以我创建了一个类ConfigBlock。此类读取所有参数源并将其存储在适当的数据结构中。示例是路径和文件名,用户可以在配置文件或--verbose CLI标志中更改它们。然后,可以调用ConfigBlock.GetVerboseLevel()以读取此特定参数。 我的问题:在一个类中收集所有此类运行时配置数据是一种好习惯吗? 然后,我的班级需要访问所有这些参数。我可以想到几种方法来实现这一目标,但是我不确定该采取哪种方法。类的构造函数可以是对我的ConfigBlock的给定引用,例如 public: MyGreatClass(ConfigBlock &config); 或者,它们仅包含标头“ CodingBlock.h”,其中包含我的CodingBlock的定义: extern CodingBlock MyCodingBlock; 然后,仅类.cpp文件需要包含和使用ConfigBlock内容。 .h文件不会将此接口引入类的用户。但是,ConfigBlock的接口仍然存在,但是从.h文件中隐藏了该接口。 这样隐藏起来好吗? 我希望接口尽可能小,但最后,我想每个需要配置参数的类都必须与我的ConfigBlock连接。但是,这种连接应该是什么样的?

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.