Questions tagged «design-patterns»

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

2
发布-订阅模式与gotos有何不同?
我的理解是,Goto语句通常不被接受。但是,发布-订阅模式在概念上似乎是相似的,因为一段代码发布一条消息时,它将执行单向控制转移。程序员可能不知道程序的哪些部分正在订阅此消息。 我在许多JavaScript程序中都看到了类似的东西,在这些程序中,事件用于方便地跨模块“跳跃”。我是否缺少有关发布-订阅或事件驱动模式的信息?

1
MVC + 3层;ViewModels在哪里发挥作用?
我正在使用ASP.NET MVC 4设计一个三层应用程序。我使用以下资源作为参考。 CodeProject:MVC + N层+实体框架 在ASP.NET MVC中分离数据访问 到目前为止,我有以下目的。 表示层(PL) (主MVC项目中,中号的MVC被转移到数据访问层): MyProjectName.Main Views/ Controllers/ ... 业务逻辑层(BLL): MyProjectName.BLL ViewModels/ ProjectServices/ ... 数据访问层(DAL): MyProjectName.DAL Models/ Repositories.EF/ Repositories.Dapper/ ... 现在,PL引用BLL,而BLL引用DAL。这样,下层不依赖于其上一层。 在这种设计中,PL调用BLL的服务。PL可以将视图模型传递给BLL,而BLL可以将视图模型传递回PL。 同样,BLL调用DAL层,而DAL层可以将模型返回给BLL。BLL可以依次构建视图模型并将其返回给PL。 到目前为止,这种模式一直在为我工作。但是,我遇到了一个问题,其中某些ViewModel需要在多个实体上进行联接。在普通的MVC方法中,在控制器中,我使用LINQ查询执行joins,然后执行select new MyViewModel(){ ... }。但是现在,在DAL中,我无法访问在(在BLL中)定义ViewModel的位置。 这意味着我无法在DAL中加入联接并将其返回给BLL。看来我必须在DAL中进行单独的查询(而不是在一个查询中进行联接),然后BLL将使用这些结果来构建ViewModel。这非常不方便,但是我不认为我应该将DAL暴露给ViewModels。 有什么想法可以解决这个难题吗?谢谢。

2
.NET开发人员试图学习Rails上的Ruby
我是.NET开发人员,本周末我才有机会与Ruby on Rails一起玩。 在.NET中,我们通过创建单独的类库项目来分离应用程序的各个层。从设计模式的角度来看,我们是否也必须在Rails中做到这一点,还是仅仅是其中包含所有内容的整个项目?

4
命令模式设计
我有Command模式的旧实现。这是通过所有DIOperation实现传递一个Context的方法,但是后来我意识到,在学习过程中(永远不会停止),这并不是最佳的。我也认为这里的“访问”并不适合,只会造成混乱。 我实际上是在考虑重构我的代码,这也是因为一个Command对其他命令一无所知,并且现在它们都共享相同的键值对。很难维护哪个类拥有哪个键值,有时会导致变量重复。 用例示例:假设CommandB需要由CommandA设置的UserName。CommandA是否应该设置键UserNameForCommandB = John?还是应该共享一个公共的UserName = John键值?如果用户名被第三个命令使用怎么办? 如何改善设计?谢谢! class DIParameters { public: /** * Parameter setter. */ virtual void setParameter(std::string key, std::string value) = 0; /** * Parameter getter. */ virtual std::string getParameter(std::string key) const = 0; virtual ~DIParameters() = 0; }; class DIOperation { public: /** * Visit before …


3
何时传出/传出耦合好坏
我这周要参加软件模式考试,我们要学习的主题之一是传出和传出耦合。 我了解,如果封装依赖于许多其他类型,则封装的Ce(有效耦合)较高。 例如: class Car{ Engine engine; Wheel wheel; Body body; } 该类具有较高的传出联轴器,因为它取决于引擎,车轮和车身类型。 如果“ Wheel”类型依赖于其他几个包装(汽车,飞机,自行车),则Ca(费伦特耦合)会较高。 我们考试中可能出现的问题之一是,何时传出/传出耦合好坏?这在我看来很奇怪,因为从逻辑上讲,程序需要具有高传入/传入耦合的包/类。 有没有人举例说明何时/何处高传出或传入耦合好/不好? 谢谢 !

5
CSS-使用通用的“ *”选择器与HTML还是正文选择器?
将样式应用于body标签将应用于整个页面,因此 body { font-family: Verdana } 将应用于整个页面。这也可以用 * {font-family: Verdana} 这将适用于所有元素,因此似乎具有相同的效果。 我了解这样的原理:在第一种情况下,样式将应用于整个页面的主体一个标签,而在第二种示例中,将字体应用于每个单独的html元素。我要问的是这样做的实际区别是什么,其含义是什么,导致相互使用的原因,情况或最佳实践是什么。 副作用之一当然是速度(+1 Rob)。我最感兴趣的是在功能方面选择一个而不是另一个的实际原因。

8
为什么不将设计模式添加到语言构造中?
最近,我正在与一位同事交谈,他提到他的公司正在努力将MVC设计模式添加为PHP扩展。 他解释说,他们编写了C代码以添加Controllers, Models and Views到语言构造中以提高性能。 现在,我知道MVC是一种架构设计模式,已在Web应用程序中广泛使用,但是我仍然不得不遇到例如具有Controllers语言构造的语言。 恕我直言,将设计模式集成到语言中可以强调良好的OO设计的重要性。 那么,为什么不将最常用的设计模式(MVC,工厂,策略等)添加到语言构造中呢? 如果问题听起来太宽泛,则可以将问题限制为仅PHP。 编辑: 我并不是在暗示开发项目时必须使用设计模式。实际上,我提倡只要可行就保持简单的方法。

9
使用哪种OO设计(是否有设计模式)?
我有两个代表“酒吧/俱乐部”(您喝酒/社交的地方)的对象。 在一种情况下,我需要栏名称,地址,距离,标语 在另一种情况下,我需要栏名称,地址,网站网址,徽标 因此,我有两个对象代表相同的事物,但具有不同的字段。 我喜欢使用不可变的对象,因此所有字段都是从构造函数设置的。 一种选择是拥有两个构造函数,而其他字段为空,即: class Bar { private final String name; private final Distance distance; private final Url url; public Bar(String name, Distance distance){ this.name = name; this.distance = distance; this.url = null; } public Bar(String name, Url url){ this.name = name; this.distance = null; this.url = url; …

4
我会遭受封装使用过度的困扰吗?
我在各种项目的代码中注意到了一些东西,这些东西似乎让我感到代码难闻,有些事情要做,但我无法解决。 在尝试编写“干净的代码”时,我倾向于过度使用私有方法,以使我的代码更易于阅读。问题在于代码确实更干净,但是测试起来也更加困难(是的,我知道我可以测试私有方法...),总的来说,这对我来说是个坏习惯。 这是一个类示例,该类从.csv文件中读取一些数据并返回一组客户(另一个具有各种字段和属性的对象)。 public class GroupOfCustomersImporter { //... Call fields .... public GroupOfCustomersImporter(String filePath) { this.filePath = filePath; customers = new HashSet<Customer>(); createCSVReader(); read(); constructTTRP_Instance(); } private void createCSVReader() { //.... } private void read() { //.... Reades the file and initializes the class attributes } private void readFirstLine(String[] inputLine) …

2
将“结果”与“状态”分开的好处是什么
假设您有一些自动化流程,这些流程通常会经历以下状态;预定-启动-验证-执行-完成 最重要的是,由于错误或明确的用户取消,这些过程可能会过早结束。 我的第一个冲动就是简单地将错误添加并取消到可能的状态值列表中,但是我想知道将结果与状态分开的(概念上的)优势(即使在我看来,有人可能会认为错误和取消也是与完成状态完全不同的状态)。

4
迭代器是否具有非破坏性的隐含合同?
假设我正在设计一个自定义数据结构,如堆栈或队列(例如-可能是其他任意有序集合,其逻辑等效于pushand pop方法-即破坏性访问器方法)。 如果您要IEnumerable<T>在每次迭代中弹出的这个集合上实现一个迭代器(特别是在.NET中),那会打破IEnumerable<T>Breaking的隐含契约吗? 是否IEnumerable<T>有此隐含合同? 例如: public IEnumerator<T> GetEnumerator() { if (this.list.Count > 0) yield return this.Pop(); else yield break; }

3
CRTP是否使用了很多?以及为什么是/不是?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 6年前关闭。 我正在考虑奇怪地重复使用模板模式。 我发现它非常有用,并且对于许多任务来说都可以很好地调整。但是我必须承认,我没有看到很多CRTP代码。 很难把握吗?虚拟功能总体上是否更容易?90%出现虚拟关键字的情况下,是否应该使用它?

6
与单一责任原则作斗争
考虑以下示例: 我有一个网站。它允许用户发布帖子(可以是任何内容)并添加描述帖子的标签。在代码中,我有两个代表帖子和标签的类。让我们称这些类Post和Tag。 Post负责创建帖子,删除帖子,更新帖子等。 Tag负责创建标签,删除标签,更新标签等。 缺少一项操作。标签到帖子的链接。我正在努力与谁应该执行此操作。它在任何一个类别中都同样适用。 一方面,Post该类可以具有一个将a Tag作为参数的函数,然后将其存储在标签列表中。另一方面,Tag该类可以具有将a Post作为参数并将链接Tag到的函数Post。 以上只是我的问题的一个示例。实际上,我遇到了多个相似的类。两者都可以很好地融合在一起。除了实际上在两个类中都包含功能之外,还存在哪些约定或设计风格可以帮助我解决此问题。我假设必须要挑选一个呢? 也许将它们放在两个类中都是正确的答案?

4
为游戏创建基于行为/组件的系统
背景 我将游戏开发作为一种业余爱好,并且正在寻找一种更好的设计方式。目前,我正在使用一种标准的OOP方法(我从事企业开发已经8年了,所以很自然)。以“坏蛋”为例 public class Baddie:AnimatedSprite //(or StaticSprite if needed, which inherit Sprite) { //sprite base will have things like what texture to use, //what the current position is, the base Update/Draw/GetInput methods, etc.. //an AnimatedSprite contains helpers to animated the player while //a StaticSprite is just one that will draw …

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.