Questions tagged «patterns-and-practices»

软件工程中的设计模式(针对常见问题的可重复解决方案)和最佳实践

1
如何选择使用域事件还是让应用程序层协调一切
我正在迈入域驱动设计的第一步,购买了蓝皮书和其他所有书籍,我发现自己看到三种实现特定解决方案的方法。作为记录:我没有使用CQRS或事件源。 假设有一个用户请求进入了应用程序服务层。出于某种原因,该请求的业务逻辑分为实体上的方法和域服务上的方法。我应该如何去调用那些方法? 到目前为止,我收集的选项有: 让应用程序服务调用这两种方法 使用方法注入/双重调度将域服务注入到实体中,让实体来做,然后让它调用域服务的方法(或者反之,让域服务在实体上调用方法) 在实体方法中引发一个域事件,该事件的处理程序调用域服务。(我正在谈论的域事件是:http : //www.udidahan.com/2009/06/14/domain-events-salvation/) 我认为这些都是可行的,但我无法在它们之间进行选择。我已经考虑了很长时间了,直到现在我再也看不到这三者之间的语义差异了。您知道什么时候使用什么准则吗?

7
在数据库中使用位掩码的优缺点
不久前,我与同事交谈,他绝对反对使用位掩码,因为很难理解存储在数据库中的所有值。我认为使用它们(例如确定当前用户的角色)并不总是一个坏主意。否则,您需要将其存储在单独的表中,这将导致另一个JOIN。如果我错了,你能告诉我吗?使用位掩码还有其他副作用,优点/缺点吗?

4
使用方法链接构建对象的成语叫什么名字?
我经常使用一种模式,在该模式下,我使用方法链来设置一个对象,类似于Builder或Prototype模式,但没有在每个方法调用中创建新对象,而是修改了原始对象。 例: new Menu().withItem("Eggs").withItem("Hash Browns").withStyle("Diner"); 只是想知道这种模式是否有名称,以及是否将其视为反模式,因为尽管它可以更流畅地阅读,但它可能导致较长的方法链。

4
您采取什么措施来避免在大型数据库中错误地更新数据?
在进行任何生产部署之前,通常的建议是先备份数据库。这样,如果新更新存在一些可能导致潜在数据丢失或逻辑数据损坏的问题,则您仍具有备份以比较和更正旧记录。 但是,这可以很好地工作,直到数据库大小达到几GB。一旦数据库很大,备份就需要很长时间才能完成。在这种情况下应遵循哪些最佳实践,以避免由于代码部署中的逻辑问题而导致逻辑数据损坏?

2
使用新的System.Tuple类设计不好吗?
我喜欢System.Tuple的概念,因为它允许我在不实例化新类的情况下在单个函数调用中返回多个参数,但这是否违反了Microsoft的Patterns&Practices,SOLID Principles等任何良好的编程习惯。 我只是试图确定我应该使用该功能的自由度,还是仅在必要时在极端情况下使用它。

9
作为一个新的团队负责带可维护性问题的项目该怎么办?
我刚刚负责一个涉及可维护性问题的代码项目。我怎样做才能使项目稳定下来? 我发现自己在一个我们正在使用非常大型的多层.NET系统的地方,该系统缺少许多重要的东西,例如单元测试,IOC,MEF,太多的静态类,纯数据集等。只有24岁,但我已经在这里待了将近三年(此应用程序已经开发了5年),并且主要是由于时间限制,我们一直在添加更多的废话以适应其他废话。在空闲时间做完许多项目之后,我开始理解所有这些概念的重要性。同样由于员工的转移,我发现自己现在是这个项目的团队负责人,我真的很想提出一些聪明的方法来改进此应用程序。可以向管理层解释价值的方式。我对自己想做的事情有想法,但是这些想法似乎都让人不知所措,没有太多前期收获。关于人们如何或将如何处理这个问题的任何故事都将是非常有趣的读物。谢谢。

6
尝试/捕获/记录/重新抛出-是反模式吗?
我可以看到几篇文章,其中强调了在中心位置或过程边界处处理异常的重要性,这是一种好的做法,而不是乱丢try / catch周围的每个代码块。我坚信我们大多数人都了解它的重要性,但是我仍然看到人们仍然使用catch-log-threrow反模式,主要是因为在任何异常情况下,为了简化故障排除工作,他们想记录更多特定于上下文的信息(例如:方法参数)通过),方法是将方法包装在try / catch / log / rethrow周围。 public static bool DoOperation(int num1, int num2) { try { /* do some work with num1 and num2 */ } catch (Exception ex) { logger.log("error occured while number 1 = {num1} and number 2 = {num2}"); throw; } } 在保持异常处理良好实践的同时,有没有正确的方法来实现这一目标?我听说过类似PostSharp的AOP框架,但是想知道这些AOP框架是否有任何不利或主要的性能成本。 谢谢!

4
允许用户定义字段是不好的做法吗?
一般来说,允许用户在Webapp数据库中创建用户创建的字段是否被认为是不好的做法? 例如,我正在为妻子制作一个房屋库存网络应用程序,而她将要为不同的项目定义自己的字段。我打算允许她创建商品类别,并在这些类别中添加“功能”。功能只是将键/值存储为字符串。这样,例如,如果她有一个名为“音频CD”的类别,则可以为“艺术家”,“曲目”等内容添加功能。但是在另一个“家具”类别中,她可以为诸如“材料”之类添加功能”(木材,塑料等)。然后,任何项目都可以属于一个(或多个)类别,将那些功能添加到该项目中。 我看到的问题是,通过这些功能进行搜索需要字符串比较,没有数据验证等。按照敏捷的方法,也许最好是让她提出新的类别和属性,而我只需要创建新表当我们去。在我的示例中,这是一个很小的用户群(我们当中有2个),并且创建的记录量很小,因此也不错。 一般来说,人们在“现实生活”中如何处理这样的事情?


5
组合获取器和设置器
诸如jQuery之类的JavaScript库在编程界面中结合了“ getters”和“ setters”,例如: $('element').css({'color','blue'}); 将设置颜色或 $('element').css(); 将获取元素的css。 这种模式有名称吗,在应用程序中使用是一种好习惯吗?

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 } …

6
策略模式的优势
如果仅在if / then情况下编写代码,使用策略模式为什么有好处? 例如:我有一个TaxPayer类,它的一种方法使用不同的算法来计算税收。那么,为什么不具有if / then情况并找出在该方法中使用哪种算法而不是使用策略模式呢?另外,为什么不能只为TaxPayer类中的每个算法实现单独的方法? 另外,算法在运行时更改意味着什么?

12
使用条件句是否是反模式?
我在工作中的遗留系统中看到了很多东西-这些功能如下所示: bool todo = false; if(cond1) { ... // lots of code here if(cond2) todo = true; ... // some other code here } if(todo) { ... } 换句话说,功能有两个部分。第一部分进行某种处理(可能包含循环,副作用等),并沿途设置“ todo”标志。仅当已设置“ todo”标志时才执行第二部分。 这似乎是一种非常丑陋的处理方式,而且我认为我花了很多时间去理解的大多数情况都可以重构,以避免使用该标志。但这是一个实际的反模式,一个坏主意还是完全可以接受? 第一个明显的重构是将其分为两种方法。但是,我的问题更多是关于是否有必要(在现代的OO语言中)创建一个局部标志变量,可能将其设置在多个位置,然后在以后使用它来决定是否执行下一个代码块。

6
在哪个顺序定义吸气剂和吸气剂?[关闭]
按照目前的情况,这个问题并不适合我们的问答形式。我们希望答案得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 7年前关闭。 订单中定义吸气剂和吸气剂是否有最佳实践?似乎有两种做法: 吸气剂/设定剂对 首先是吸气剂,然后是二传手(或者反之) 为了说明不同之处,这里是一个getter / setter对的Java示例: public class Foo { private int var1, var2, var3; public int getVar1() { return var1; } public void setVar1(int var1) { this.var1 = var1; } public int getVar2() { return var2; } public void setVar2(int var2) { this.var2 = var2; } public …

5
如何将我的思想从C ++迁移到C#
我是一位经验丰富的C ++开发人员,我对语言非常了解,并且已经大量使用了其某些特定功能。另外,我了解OOD的原理和设计模式。我现在正在学习C#,但是我无法停止无法摆脱C ++心态的感觉。我将自己与C ++的优势紧密联系在一起,以致于我无法缺少某些功能。而且我在C#中找不到任何好的解决方法或替代方法。 有什么好的做法,设计模式,成语是在C#不同于C ++的角度可以建议?如何获得一个完美的C ++设计,而不是C#中的笨拙? 具体来说,我找不到一种很好的C#方式来处理(最近的示例): 控制需要确定性清除的资源(例如文件)的生命周期。这很容易using掌握,但是当资源的所有权正在转移时[...在线程之间]如何正确使用它呢?在C ++中,我只使用共享指针,并让它在适当的时候处理“垃圾回收”。 不断为特定泛型的重写功能而苦苦挣扎(我喜欢C ++中的部分模板专门化之类的东西)。我应该放弃使用C#进行通用编程的任何尝试吗?也许泛型是有目的的,除了特定领域的问题外,使用C并不是C#风格? 类似宏的功能。虽然通常是个坏主意,但对于某些问题领域,没有其他解决方法(例如,对语句的条件评估,例如只应运往Debug版本的日志)。没有它们意味着我需要放置更多if (condition) {...}样板,并且在触发副作用方面仍然不尽相同。

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.