Questions tagged «design-patterns»

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

4
何时使用存储库模式
我最近读到,将存储库模式与ORM结合使用不是一种好习惯。从我的理解来看,这是因为它们在SQL数据库上提供的抽象太泄漏而无法包含在模式中。 我对此有两个问题: 如果要转出ORM,该怎么办?如果您未在存储库中包含ORM特定代码,则您的应用程序中将包含该代码。 当不使用ORM且您正在使用ADO.NET进行数据访问并自己填充对象数据时,存储库模式仍然有效吗? 如果您使用ORM而不是存储库模式,那么将常用查询保留在哪里?将每个查询表示为一个类并具有某种查询工厂来创建实例是否明智?

5
实体组件系统体系结构对象是否按定义定向?
按照定义,实体组件系统体系结构是否面向对象?对我来说,这似乎更具程序性或功能性。我的观点是,它不会阻止您以OO语言实现它,但是以坚定的OO方式实现它并不是惯用的。 似乎ECS会将数据(E&C)与行为(S)分开。作为证据: 这个想法是在实体中没有嵌入任何游戏方法。 和: 该组件包含用于特定目的的最少数据集 系统是具有一组具有特定组件的实体的单一目的功能 我认为这不是面向对象的,因为面向对象的很大一部分是将您的数据和行为结合在一起。 作为证据: 相反,面向对象的方法鼓励程序员将数据放置在程序其余部分无法直接访问的位置。而是通过调用专门编写的函数(通常称为方法)来访问数据,这些函数与数据捆绑在一起。 另一方面,ECS似乎只不过是将数据与行为分开。

10
可以/应该将单一责任原则应用于新法规吗?
将该原理定义为具有更改理由的模块。我的问题是,在代码实际开始更改之前,这些更改原因肯定是未知的吗?几乎每一段代码有许多原因,它可能会可能改变,但肯定尝试预见所有的这些设计和代码考虑到这一点最终会很差代码。仅在开始请求更改代码时才真正开始应用SRP,这不是一个更好的主意吗?更具体地说,当一段代码由于多个原因而多次更改时,因此证明它具有多个更改原因。尝试猜测更改的原因听起来很反敏捷。 一个示例是一段打印文档的代码。提出了将其更改为打印为PDF的请求,然后再次请求将其更改为对文档应用某些不同的格式。在这一点上,您有证据证明有多个原因需要更改(并且违反了SRP),并且应该进行适当的重构。

2
为我的图书馆实施的“异常数量”是多少?
我一直想知道应该为软件的各个部分实现并抛出多少个不同的异常类。我的特定开发通常与C ++ / C#/ Java有关,但是我认为这是所有语言的问题。 我想了解抛出很多不同异常的情况,以及开发人员社区对好的库的期望。 我看到的权衡包括: 更多的异常类可以为API用户提供非常精细的错误处理级别(容易发生用户配置或数据错误,或者找不到文件) 更多的异常类允许将特定于错误的信息嵌入到异常中,而不仅仅是字符串消息或错误代码 更多的异常类可能意味着更多的代码维护 更多的异常类可能意味着该API对用户的访问性降低 我希望了解异常用法的场景包括: 在“配置”阶段,可能包括加载文件或设置参数 在“操作”类型阶段,库可能正在运行任务并正在做一些工作,也许在另一个线程中 不使用异常或较少异常(作为比较)的其他错误报告模式可能包括: 更少的异常,但是嵌入了可以用作查找的错误代码 直接从函数返回错误代码和标志(有时无法从线程返回) 发生错误时实施事件或回调系统(避免堆栈展开) 作为开发人员,您希望看到什么? 如果有很多异常,您是否还要分别处理错误? 根据操作阶段,您是否倾向于错误处理类型?

7
编写自己的数据访问/数据映射层是“好”主意吗?
当前,我们处于选择使用现成的对象关系映射器或滚动自己的关系的情况下 我们有一个遗留应用程序(ASP.NET + SQL Server),其中数据层和业务层不幸地混在一起。该系统在数据访问方面并不是特别复杂。它从一大组(35-40)相互关联的表中读取数据,在内存中进行处理,然后以摘要格式将其保存回其他表中。现在,我们有机会进行一些重构,并且正在寻找可用于分离和正确构建数据访问的候选技术。 无论我们决定采用哪种技术,我们都希望: 在我们的域模型中具有持久性忽略的POCO对象 有一个抽象层,使我们可以根据模拟的基础数据源对域模型对象进行单元测试 显然,在模式和框架等方面已经有很多东西。 我个人正在推动将EF与ADO.NET单元可测试存储库生成器/ POCO实体生成器结合使用。它满足了我们的所有要求,可以轻松地捆绑在Repo / UnitOfWork模式中,并且我们的数据库结构相当成熟(已经进行了重构),因此我们不会每天对模型进行更改。 但是,小组中的其他人则建议完全从头开始设计/发布我们自己的DAL。(自定义DataMappers,DataContext,存储库,无处不在的接口,过分依赖以创建具体对象,自定义LINQ到底层查询翻译,自定义缓存实现,自定义FetchPlan实现...),该列表不胜枚举,直言不讳我是疯子。 引发的一些争论是“至少我们将控制自己的代码”或“哦,我在先前的项目中使用过L2S / EF,这无非是头疼”。(尽管我以前在生产中都使用过,发现任何问题很少而且相差不大,而且很容易处理) 因此,您在超级经验丰富的开发人员/架构师中是否有任何智慧的言语可能会帮助我将这个产品从我看来将是一场彻底的灾难中解脱出来。我忍不住想,通过规避EF问题而获得的任何利益,都将因尝试重新发明轮子而同样迅速地丧失。

1
嵌套的REST网址和父ID,哪个设计更好?
好的,我们有两个资源:Album和Song。这是API: GET,POST /albums GET,POST /albums/:albumId GET,POST /albums/:albumId/songs GET,POST /albums/:albumId/songs/:songId 我们知道我们讨厌某首歌,Susy例如。我们应该在哪里search采取行动? 另一个问题。好吧,现在更真实了。我们打开专辑1并加载所有歌曲。我们创建了JS对象,每个对象都保存歌曲数据,并具有如下几种方法:remove,update。 歌曲对象具有ID,名称和内容,但是不知道它属于哪个父对象,因为我们通过查询来检索歌曲列表,因此每个父对象都返回父ID并不是很好。我错了吗? 因此,我看到的解决方案很少,但我不确定。 将父ID设为可选-作为get-parameter。我目前使用的是这种方法,但我觉得它很丑。 List,Create /songs?album=albumId Update,Delete /songs/:songId Get /songs/?name=susy # also, solution for first question 混合动力车 现在方便了,因为我们需要唱片集ID来执行OPTIONS查询以获取元数据。 List,Create /album/:albumId/songs Update,Delete /songs/:songId POST /songs/search # also, solution for first question 返回每个资源实例的完整URL。API是相同的,但是我们会得到如下歌曲: id: 5 name: 'Elegy' url: /albums/2/songs/5 我听说这种方法称为HATEOAS。 所以...提供父母身分证 id: …

7
模式与原理的区别
面向对象的设计模式和原理之间有什么区别?他们是不同的东西吗?据我了解,他们两个都试图实现一些共同的目标(例如灵活性)。那么我可以说模式是原则,反之亦然吗? 设计原理= SOLID(即依赖反转原理) 设计模式= Gof(即抽象工厂模式)

5
使用仅包含静态方法的*** Helper或*** Util类是AntiPattern
我经常遇到Java或任何类型的语言中的helper或util类。因此,我问自己这是否是某种反模式,而此类类的存在只是软件设计和体系结构中缺少一些缺失。 通常,这些类仅使用静态方法进行限制,该方法可以完成很多工作。但大多数情况下,确实是上下文相关的并且是全状态的。 我的问题是,您对此类静态辅助程序/ util类有何看法,因为其优势当然是仅使用类名进行快速调用。 在哪种抽象级别上,您将避免使用此类? 我认为关键字“ static”应该只允许在类(Java)的声明中使用,而不能用于方法。我认为以这种方式使用它,是在Java中结合过程式和OO-范式并避免滥用关键字的一种很好的选择,也是中间的选择。 由于答案而增加的内容: 起初,我认为能够组合不同的范例甚至在机器或vm编译的代码中使用运行时解释的脚本语言是完全合法的。 我的经验是,在项目的开发过程中,此类帮助器和utils或其他名称正在不断增长,并在最初被设计为模块化和灵活的代码库的每个被遗忘的角落使用。而且由于缺乏时间进行重构或重新考虑设计,随着时间的推移,您的情况只会变得更糟。 我认为static应该从Java中删除。尤其是在现在可以使用更复杂的功能语言元素的地方。



9
设计模式在编程中有多重要?
我是一名大学生,我刚刚开始学习设计模式,并努力了解它们的目的。我尝试研究它们,但是我发现的所有资源似乎都是以学术而非专业的方式谈论它们。 他们的目的是什么,对学习重要吗?

3
通过方法链传递上下文的模式
这是出现要拿出相当多的设计决策:如何通过上下文通过并不需要它,做的方法等。是否有一个正确的答案,或者它取决于上下文。 需要解决方案的示例代码 // needs the dependency function baz(session) { session('baz'); } // doesn't care about the dependency function bar() { baz(); } // needs the dependency function foo(session) { session('foo') bar(); } // creates the dependency function start() { let session = new Session(); foo(session); } 可能的解决方案 本地线程 全球 上下文对象 …

6
在实现旁边记录是否违反SRP?
在考虑敏捷软件开发和所有原理(SRP,OCP等)时,我问自己如何对待日志记录。 在实现旁边记录是否违反SRP? 我会说,yes因为该实现也应该能够运行而无需登录。那么如何更好地实现日志记录呢?我检查了一些模式,得出的结论是,最好不要以用户定义的方式违反原则,而是使用已知违反原则的任何模式的最佳方式是使用装饰器模式。 假设我们有一堆完全没有违反SRP的组件,然后我们想要添加日志记录。 成分A 组件B使用A 我们想要记录A,因此我们创建了另一个装饰有A的组件D,都实现了接口I。 接口我 组件L(系统的日志记录组件) 组件A实现I 组件D实现I,修饰/使用A,使用L进行日志记录 组件B使用I 优点:-我可以不使用日志就使用A-测试A意味着我不需要任何日志模拟-测试更简单 缺点:-更多组件和更多测试 我知道这似乎是另一个公开讨论的问题,但我实际上想知道是否有人使用的记录策略比装饰器或SRP违规更好。作为默认NullLogger的静态单例记录器又如何呢?如果需要syslog-logging,则在运行时更改实现对象?


2
在类中定义一个大型私有函数以保持有效状态(即更新对象的数据成员)是否是一个好主意?
尽管在下面的代码中使用的是在电子商务站点中简单的单项购买,但我的一般问题是有关更新所有数据成员以始终保持对象数据处于有效状态的信息。 我发现“一致性”和“国家是邪恶的”是相关的短语,在这里进行了讨论:https : //en.wikibooks.org/wiki/Object_Oriented_Programming#.22State.22_is_Evil.21 <?php class CartItem { private $price = 0; private $shipping = 5; // default private $tax = 0; private $taxPC = 5; // fixed private $totalCost = 0; /* private function to update all relevant data members */ private function updateAllDataMembers() { $this->tax = $this->taxPC * …

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.