Questions tagged «design-patterns»

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

4
访客模式在这种情况下有效吗?
我任务的目标是设计一个可以运行计划的定期任务的小型系统。重复执行的任务类似于“星期一至星期五,从上午8:00到下午5:00,每小时发送一封电子邮件给管理员”。 我有一个名为RecurringTask的基类。 public abstract class RecurringTask{ // I've already figured out this part public bool isOccuring(DateTime dateTime){ // implementation } // run the task public abstract void Run(){ } } 我有几个从RecurringTask继承的类。其中之一称为SendEmailTask。 public class SendEmailTask : RecurringTask{ private Email email; public SendEmailTask(Email email){ this.email = email; } public override void Run(){ …

3
将接口用于数据类型是否是反模式?
假设我的模型中有多个实体(使用EF),例如用户,产品,发票和订单。 我正在编写一个用户控件,该控件可以在我的应用程序中打印实体对象的摘要,其中这些实体属于预先确定的集合,在这种情况下,我说可以概括用户和产品的摘要。 这些摘要都只有一个ID和一个描述,因此我为此创建了一个简单的接口: public interface ISummarizableEntity { public string ID { get; } public string Description { get; } } 然后,对于有问题的实体,我创建一个实现此接口的局部类: public partial class User : ISummarizableEntity { public string ID { get{ return UserID.ToString(); } } public string Description { get{ return String.Format("{0} {1} is from {2} and is …

1
菜单构建模式
当菜单不用于路由时,我难以理解菜单的活动状态处理。 我来自Drupal,菜单系统也处理路由。因此,设置活动状态和活动尾随状态由路由处理(也充当菜单渲染系统)。 现在,许多PHP框架都有处理路由的Router类。这似乎是一个很好的分隔,因为菜单不应该知道POST ||。选项|| ... 要求。 但是在编写前端时,我发现自己很难对菜单进行编码。或者将所有内容存储在数据库中,然后将这些值传递给视图。我不喜欢这种方法的原因是您正在创建已经在Router中写过的内容的副本,但是现在使用Menu类。 一个例子: Route::get('/somewhere','routename.somewhere','showStuffController'); Route::post('/somewhere','routename.somewhere','saveStuffController'); Menu::add('label.somewhere','routename.somewhere'); 您在这里分离关注点,所以很好。但是Menu在很大程度上取决于Route来设置其活动状态。菜单还必须了解有关设置活动跟踪的层次结构。 因此,是的,设置活动路径和活动状态类实际上是一种视图。但是有 if ( Route::currentName() === $menuitem->getRouteName() ) { print 'active'; } 您的所有观点看来都是愚蠢的。然后添加所有那些烦人的活动提示if,这确实是个肿。我知道,在视图渲染之前处理该问题并将active-trail标志设置为true似乎很丑陋(foreach遍历所有子级,遍历所有子级,...) 我的问题是: 有没有一种模式或聪明的方法来使这种清洁剂变得更好,更好……?一个人应该如何应对主动式“问题”? 我当时想渲染子级->父级。因此,从最深层次的广告开始,然后逐步发展。但是,孩子对父母一无所知,但父母对孩子一无所知(似乎很奇怪)。

1
在API和应用程序之间共享对象的模式
我对我的Web应用程序的设计有严重的怀疑。 我想将业务逻辑与接口分开,所以我制作了一个Web API,用于处理对数据库的所有请求。 它是具有实体框架,工作单元和通用存储库模式的ASP.NET Web API。到目前为止,一切都很好。 问题 我需要帮助的地方是,我找不到在API和应用程序之间共享对象的有效方法。 我不想直接序列化实体对象,我认为这将是一个坏习惯,因为如果实体模型发生更改,我最终可能会无缘无故地序列化大型对象。 现在如何实施 因为我的接口是C#中的ASP.NET Web应用程序,而我的API是C#中的API,所以我创建了一个公共库,其中定义了我想在它们之间共享的所有类。 我知道当我开发一个Android应用程序时该解决方案将不起作用,我将不得不再次用Java创建类,但这不是我最大的问题。 问题是我感觉自己一直在转换对象。 例 这是我的工作流程示例: 我从包含所有对象和表单数据注释的模型开始,然后用户将模型发布到控制器。 在控制器中,我必须将此模型转换为我的公共库中的类,然后将该对象发送到我的API。 然后,我的API中的控制器捕获了该调用,并将该对象转换为实体对象以更新数据库。 所以我有3节课 视图的模型以及用于验证的所有数据注释(客户端) 共享对象的公共库类(DLL) 实体类(API) 我感觉自己做错了什么。还有更优雅的东西吗?我想确保在这个项目变得太大之前,我有一个很好的解决方案。

2
Javascript MVC应用程序设计(画布)
我很难掌握如何在Javascript中使用类似于MVC的方法来构造/构造画布应用程序。用户界面将非常流畅和动画化,游戏也将非常简单化,但会重点强调补间和动画。我了解了MVC的工作原理,但实际上却没有。我已经从中搜查了一些漏洞,阅读了很多文章,现在和我刚开始时一样困惑。 有关应用程序区域的一些详细信息: 多屏幕游戏框架-多个游戏将位于该框架内常见的UI“屏幕”包括:设置,信息,选择难度,主菜单等。 多种输入法 常见的UI元素,例如某些屏幕上的顶部菜单栏 使用不同渲染方法(画布/ DOM / webGL)的可能性 目前,我有一个AppModel,AppController和AppView。从这里开始,我计划添加每个“屏幕”并将其附加到AppView。但是,诸如顶部菜单栏之类的东西又应该是另一个MVC三合会吗?在不紧密耦合组件的情况下,我将在何处以及如何安装它? 将一个MVC三合一组合在另一个中是否被接受?即我可以将每个“屏幕”添加到AppView吗?“ triad”甚至是公认的MVC术语吗? 我的想法在这些选择下融化了……我觉得这里缺少基本的东西。我已经有一个不使用MVC方法就可以启动并运行的解决方案,但是最后却得到了紧密耦合的解决方案-逻辑和视图,目前已经结合在一起。这个想法是打开它并使视图更容易更改(例如,将画布视图换成基于DOM的视图)。 当前使用的库:require.js,createJS,下划线,GSAP,手动MVC实现 任何指针,示例等,特别是关于事物的实际设计以及将“屏幕”划分为适当的M,V或C的指针,示例等都将受到赞赏。 ...或除MVC以外更合适的方法 [注意,如果您之前曾看过这个问题,是因为我在另外两个不正确的stackexchange社区中提出了这个问题……我的大脑已经停止运作了]

4
.NET编程和POCO类
今晚我在思考需要更改的某些应用程序时思考了一下,这让我开始思考。实体框架实体是POCO(普通的旧CLR对象),而ASP.NET MVC中使用的模型通常也是POCO。这基本上意味着仅属性,没有方法。 现在,OO编程通常允许对象封装其功能,包括其属性和方法,这允许多态发生。随着使用POCO类的兴起,通用存储库之类的设计模式变得越来越流行。过去,当我的对象有自己的CRUD操作时,现在将它们放在存储库中。 这仅仅是OO的发展而已,它从对象中删除了CRUD操作以使它们解耦,或者CRUD操作过去不应该处于对象级别,而我错了吗?哎呀,也许两者都是合法的,而且一直都是。这只是一个让我思考的观察,所以我想寻求其他意见。

2
Scala中的自我类型和特质继承有什么区别?
谷歌搜索后,出现了许多有关该主题的回复。但是,我觉得它们中的任何一个都无法很好地说明这两个功能之间的区别。所以我想再尝试一次,特别是... 使用自我类型而不是继承可以做什么,反之亦然? 对我来说,两者之间应该有一些可量化的物理差异,否则它们只是名义上的差异。 如果特征A扩展了B或自类型B,它们是否都说明存在B是必要条件?区别在哪里?

3
在MVVM WPF中将实体框架数据库上下文(模型)连接到ViewModel的最佳方法是什么?
如上述问题:在MVVM(WPF)中将实体框架数据库模型(上下文)连接到viewModel的最佳方法是什么? 我正在WPF中学习MVVM模式,很多示例展示了如何将模型实现为viewModel,但是该示例中的模型只是简单的类,我想将MVVM与实体框架模型一起使用(基于基础的方法)。将模型连接到viewModel的最佳方法是什么? 感谢您的回答。 //ctor of ViewModel public ViewModel() { db = new PackageShipmentDBEntities(); // Entity Framework generated class ListaZBazy = new ObservableCollection<Pack>(db.Packs.Where(w => w.IsSent == false)); } 这是我通常的ViewModel指导,认为有更好的方法,我正在阅读存储库模式,不确定是否可以将其适应WPF MVVM

3
在REST中创建实体关系:我可以通过发布到子ID来创建父关系吗?
我们目前正在设计一种REST API,以访问经典客户数据。API中的元素之一是用户的资产。资产在给定服务下添加。后端API仅会在给定服务下向用户添加资产。因此,没有用户-资产关系,而是用户-[服务]-资产关系。 我们的URI如下所示: /users/{id}/assets/{id}/services/{id} 使用API​​会知道资产ID和服务ID,以创建新条目。我们正在努力的是建立这种关系。 一种简单的方法是将整个关系发布到 /users/{id}/assets/ POST /users/{id}/assets {asset:${id}, service:{id}, attribute1:"{var}", attribute2:"{var}"} 但是我们实际上并不是在创建URI可能表明的资产,而是资产-服务关系。 作为替代方案,我们正在考虑将POST'ing到解决该关系的URI,如下所示: POST /users/{id}/assets/{id}/service/{id} {attribute1:"{var}", attribute2:"{var}"} 但是在这种情况下,资源路径/users/{id}/assets/{id}在POST之前将不存在,并且将被创建为副作用。 是否将POST发送到尚不存在的资源路径? 谢谢你的想法 杰拉德。

4
Perl中的编程风格
我使用Java工作,因此基本上我在编码过程中使用OOP范例。我即将开始在Perl中工作,我想知道Perl开发人员遵循的范式是什么。在Wiki中,它提到它支持许多范例,但是由于它是一种脚本语言,因此我不确定我是否理解这一点。 所以我的问题是:是Perl中Java惯用语言中我熟悉的面向对象模式,还是我需要对设计风格进行重大更改才能编写有效的Perl? 注意:这不是批评Perl的问题。我实际上必须在Perl中工作,并且想了解我编程的当前方式将如何改变。

2
如何结合“命令”和“复合”来模拟时间延迟?
作为一项学习练习(我不在学校,只是一个试图学习新东西的老家伙),我正在尝试编写一个包含传播延迟的逻辑门模拟。用户还应该能够将门组合在一起以创建更高级别的对象。 我想将设计模式应用于我的问题,但是我很难过。 我正在阅读Head First设计模式,并且我看到Command模式是一种通过延迟来模拟通过电路的电脉冲的好方法。我还看到Composite模式是模拟嵌套单元的好方法。我只是不知道如何混合两者。 换句话说,当我循环通过门时,我看到门“ x”应该开火。它具有15纳秒的延迟,因此我创建了一个距当前游戏时间15 ns的时间戳的命令。调度员在哪里?在晚餐的示例中,命令为“ Order”,女服务员和厨师分别发送命令并可以选择引入延迟。如果我有一个“综合”门,它也有自己的调度程序吗?我是否需要使用Singleton来管理队列? 我阅读了可以找到的内容,但仍然需要朝着正确的方向努力: /programming/2015549/using-command-design-pattern /programming/12016314/client-server-command-design-pattern-with-variable-delays /programming/10560892/composite-of-commands-design-pattern /programming/8874705/how-can-i-calculate-propagation-delay-through-series-of-combinational-circuits-u

5
与观察者模式相比,委托模式有什么优势?
在委托模式中,只有一个对象可以直接侦听另一对象的事件。在观察者模式中,任意数量的对象都可以侦听特定对象的事件。当设计一个需要通知其他对象事件的类时,为什么要在观察者模式上使用委托模式?我认为观察者模式更加灵活。您现在可能只有一个观察者,但是将来的设计可能需要多个观察者。

3
纪念模式背后的哲学
我一直在从Internet的各种来源阅读备忘录模式。来自不同来源的不同信息使我困惑,为什么实际上需要这种模式。 在工厂实现中,该模式的主要目的是恢复系统状态。 Wiki的主要目的是能够恢复系统上的更改。这产生了不同的影响-表示系统可以执行memento实现而无需还原。而这种还原能力就是其中的一个功能。 OODesign说 有时有必要在某个时刻捕获对象的内部状态,并具有稍后将对象恢复到该状态的能力。在发生错误或故障的情况下,这种情况很有用。 所以,我的问题是为什么我们到底要使用这个?是要保存以前的状态,还是要促进看守人和纪念品之间的封装?为什么这种封装如此重要? 编辑:对于那些访问,请检查此实现! 编辑:我正在实施对我的问题的备忘录解决方案。我将就此发布另一个问题,并将该问题链接到这个问题。感谢所有人的宝贵建议! 编辑3:这是我的示例实现的链接

5
什么时候停止继承?
很久以前,我在Stack Overflow上问了一个关于继承的问题。 我说过我以OOP方式设计国际象棋引擎。因此,我继承了Piece抽象类的所有片段,但继承仍然存在。让我按代码显示 public abstract class Piece { public void MakeMove(); public void TakeBackMove(); } public abstract class Pawn: Piece {} public class WhitePawn :Pawn {} public class BlackPawn:Pawn {} 程序员发现我的设计超出了工程学,建议删除有色块类,并保留色块作为属性成员,如下所示。 public abstract class Piece { public Color Color { get; set; } public abstract void MakeMove(); public abstract void …

4
子状态机如何将控制权交还给父状态机?
我的顶级状态机具有一些状态和边缘。我将其称为父状态机。 A ----> B ----> C 父状态机中的任何状态也可以是状态机。我将这些孩子称为状态机。 ___________ / \ A ----> | B0->B1->B2 | ----> C \____________/ 如果父状态机从A转换为B,则B的状态机将接管。一旦B完成运行,它应该如何将控制权交给父状态机并转换为状态C?您使用哪种设计模式? 如果您想知道,我在父状态机中有子状态机,因为我的确切项目非常复杂,并且封装子状态的内部工作是很自然的。

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.