Questions tagged «design»

有关通过软件设计解决问题和计划解决方案的问题。

3
REST是否仅限于乐观并发控制?
语境 由于REST体系结构样式的无状态性(涉及每个请求完全独立),导致服务器从不存储有关客户端的任何信息。 因此,悲观并发控制不合适,因为这将要求服务器存储哪个客户端获得资源锁定。然后在Etag标头的帮助下使用乐观并发控制。(顺便说一句,正如我在那儿问的/programming/30080634/concurrency-in-a-rest-api) 问题 乐观并发控制机制的主要问题在于,您始终允许所有客户端执行任何操作。 我想避免这种情况,而不会破坏REST的无状态原则。我的意思是,所有客户端都无法随时执行任何操作。 题 在我看来,采用半乐观并发控制机制是可能的,例如: 客户可以请求令牌 只能生成一个令牌,并且有效期有限 要对资源(例如POST或PUT)执行操作,客户端必须将此令牌作为请求正文(或标头?)的一部分提供。没有令牌的客户端无法执行这些操作。 它与开放式并发控制非常相似,不同之处在于,只有一个客户端可以执行某些操作(获得令牌的操作)……与“所有客户端可以执行所有操作”相反。 这种机制是否与REST架构风格兼容?它打破了它的任何约束吗?我当时想问一下SO,但这似乎是一个与软件设计有关的高级问题。

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(){ …

1
设计一个应用程序框架,该框架将允许每个实现自定义UI的各个部分
我的任务是设计一个应用程序框架,该框架将允许每个实现自定义用户界面的各个部分。一个这样的例子就是实现(现在称它为客户端)可以定义要返回到特定屏幕的集合视图单元格。该框架仅负责出售适当的对象,以使构建应用程序变得更加容易,因为我们将构建一些外观相似的实例。 我目前对框架的方法是设计一个协调控制器,该控制器负责整个App中的所有演示和解雇事件。默认的Coordination Controller售卖框架内所有默认视图控制器,它们全部执行其相关任务,而不必提供配置的UI。例如:一个控制器将显示一个包含模板单元格的集合视图,没有什么特别的。这种设计的好处在于,它消除了控制器之间的耦合,还允许客户端覆盖默认的协调器,并为特定任务返回全新的视图控制器。 我遇到的问题是如何设计该框架,以允许客户端将自己的自定义UI添加到App中。 方法一 使框架需要一个视图工厂,并让该视图工厂负责出售所有相关视图。因此,在App Delegate中,我们可能会强制客户端创建一个CollectionViewCellFactory例如,并且该接口定义了任何符合类需要提供的所有单元。我继承了这种设计的代码库,并因为它过于抽象和可定制,而放弃了它。它为App的各个方面提供了大量的工厂,这为每个App的建立时间增加了几天的时间。 方法二 每个视图控制器都指定子类挂钩或设置API,以允许在运行时定义这些自定义UI类(类似于UISplitViewController允许调用者使用viewControllers属性设置控制器的方式)。为此,每个客户只需将基本协调控制器和每个控制器的表示形式子类化即可;在控制器上设置适当的值,以实现所需的UI。就像是 viewController.registerReusableCellsBlock = ^(UICollectionView *collectionView){ //perform custom registration } viewController.cellDequeueBlock = ^UICollectionViewCell<SomeProtocol> *(UICollectionView *collectionView,NSIndexPath *indexPath){ //dequeue custom cells } 当前,我将视图的数据源分离到一个单独的对象中,以提高可重用性并防止ViewController膨胀。这使得对视图控制器进行子类化以提供单元的接口更加困难,但并非不可能。 方法3 尝试设计框架并预期其使用可能是一个坏主意。也许最好的选择是允许子集具有最大的控制权,即使设置成本相对较高。然后,为多个客户构建了该模型之后,我可能会注意到出现的模式并开始沿路线进行优化。 我了解如何在框架内部进行自定义,而我正在努力解决的问题是如何最好地定义一个接口,该接口定义客户端对框架的潜在自定义点。 TL; DR 界面最复杂的部分涉及嵌套在“集合视图”单元格内的“集合视图”。这允许单元的水平分页和垂直滚动。这可以通过拥有一个管理水平单元格并使用新数据源配置每个单元格的收集视图的数据源来实现。 如何设计一个允许所有这些单元都可自定义的接口?

4
用DDD(或有意义)建立模型关系?
这是一个简化的要求: 用户创建一个Question带有多个Answer的。Question必须至少有一个Answer。 澄清:思考Question并Answer像测试一样:有一个问题,但是有几个答案,其中几个可能是正确的。用户是准备此测试的演员,因此他创建了问题和答案。 我正在尝试对这个简单的示例进行建模,以便1)匹配现实生活模型2)用代码进行表达,从而最大程度地减少潜在的误用和错误,并向开发人员提示如何使用该模型。 问题是实体,答案是价值对象。问题包含答案。到目前为止,我已经有了这些可能的解决方案。 [A]工厂内Question 除了Answer手动创建,我们可以调用: Answer answer = question.createAnswer() answer.setText(""); ... 这将创建一个答案并将其添加到问题中。然后,我们可以通过设置其属性来操纵答案。这样,只有问题才能创造答案。此外,我们会避免没有问题的答案。但是,我们无法控制创建答案的方式,因为答案已在中进行了硬编码Question。 上述代码的“语言”也存在一个问题。用户是创建答案而不是问题的人。就我个人而言,我不喜欢我们创建值对象并依靠开发人员将其填充值-他如何确定需要添加什么? [B]工厂内部问题,参加#2 有人说我们应该在以下方法中使用这种方法Question: question.addAnswer(String answer, boolean correct, int level....); 与上述解决方案类似,此方法将强制性数据用于答案并创建一个也将添加到问题中的答案。 这里的问题是我们无缘无故地复制的构造函数Answer。另外,问题真的会产生答案吗? [C]构造函数依赖 让我们自由地自己创建两个对象。我们还要在构造函数中表达依赖权: Question q = new Question(...); Answer a = new Answer(q, ...); // answer can't exist without a question 这为开发人员提供了提示,因为不能毫无疑问地创建答案。但是,我们看不到“语言”表明答案已“添加”到问题。另一方面,我们真的需要看到它吗? [D]构造函数依赖项,采用#2 我们可以做相反的事情: Answer a1 …

4
修改自身后,类的方法何时应返回相同的实例?
我有一个具有三个方法的类A(),B()并且C()。这些方法修改了自己的实例。 当实例必须是一个单独的副本时,方法必须返回一个实例(与一样Clone()),但是在修改方法中的同一实例而不返回任何其他值时,我可以自由选择返回void还是相同的实例(return this;)。 在决定返回相同的修改实例时,我可以进行整洁的方法链,例如obj.A().B().C();。 这是这样做的唯一理由吗? 修改自己的实例并返回它还可以吗?还是应该只返回副本并像以前一样保留原始对象?因为当返回相同的修改实例时,用户可能会假定返回的值是副本,否则将不会返回?如果可以的话,在方法中阐明此类问题的最佳方法是什么?

6
拆分大型接口
我正在使用一个带有大约50种方法的大型接口来访问数据库。该界面是由我的一位同事编写的。我们讨论了这一点: 我:50种方法太多了。这是代码气味。 同事:我该怎么办?您需要数据库访问权限-您拥有它。 我:是的,但是目前还不清楚,将来很难维护。 同事:好的,您是对的,不好。界面应该如何? 我:有5种方法返回的对象各有10种方法怎么样? 嗯,但这不一样吗?这真的会导致更加清晰吗?值得付出努力吗? 我时不时地处于需要界面的情况,而想到的第一件事就是一个大型界面。是否有通用的设计模式? 更新(响应SJuan的评论): “种类的方法”:它是用于从数据库中获取数据的接口。所有方法都具有形式(伪代码) List<Typename> createTablenameList() 方法和表并不完全是1-1关系,而是更多地关注您总是从数据库中获得某种列表的事实。

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

6
大量的时间,我想不出拥有对象而不是静态类的理由。对象有比我想象的更多的好处吗?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 5年前关闭。 我了解对象的概念,作为Java程序员,我觉得OO范式在实践中自然而然地出现在我身上。 但是最近我发现自己在想: 等等,使用对象比使用静态类(具有适当的封装和OO做法)实际具有哪些实际好处? 我可以想到使用对象的两个好处(既重要又强大): 多态性:允许您在运行时动态灵活地交换功能。还可以轻松为系统添加新功能“零件”和替代品。例如,如果有一个Car设计用于处理Engine对象的类,并且您想向Car可以使用的系统中添加一个新的Engine,则可以创建一个新的 Engine子类并将该类的Car对象简单地传递给该 对象,而不必改变一切Car。您可以在运行时决定这样做。 能够“传递功能”:您可以动态地在系统中传递对象。 但是与静态类相比,对象还有更多优势吗? 通常,当我向系统添加新的“部件”时,我会通过创建新类并从中实例化对象来实现。 但是最近,当我停下来想一想时,我意识到在很多我通常使用对象的地方,静态类将与对象相同。 例如,我正在为我的应用程序添加一个保存/加载文件机制。 对于一个对象,代码的调用行将如下所示: Thing thing = fileLoader.load(file); 对于静态类,它看起来像这样: Thing thing = FileLoader.load(file); 有什么不同? 通常,当普通的静态类的行为相同时,我只是想不出实例化对象的理由。但是在OO系统中,静态类很少见。所以我一定想念一些东西。 除了上面列出的两个对象以外,对象还有其他优点吗?请解释。 编辑:澄清。在交换功能或传递数据时,我确实发现对象非常有用。例如,我写了一个组成旋律的应用程序。MelodyGenerator有几个不同的子类创建旋律,并且这些类的对象是可互换的(策略模式)。 旋律也是对象,因为传递它们很有用。和弦和音阶也是如此。 但是,系统的“静态”部分又将如何传递呢?例如-一种“保存文件”机制。为什么要在对象而不是静态类中实现它?

2
C标准递归考虑一致性的原因是什么?
C99标准在6.5.16:2中指出: 赋值运算符的左值应为可修改的左值。 并在6.3.2.1:1中: 可修改的左值是不具有数组类型,不完整的类型,不具有const限定类型的左值,并且如果是结构或联合,则不具有任何成员(递归包括任何成员)或const限定类型的所有包含的集合或联合的元素)。 现在,让我们考虑一个非const struct带const字段。 typedef struct S_s { const int _a; } S_t; 按照标准,以下代码是未定义行为(UB): S_t s1; S_t s2 = { ._a = 2 }; s1 = s2; 这样做的语义问题是,根据实体(struct)的声明类型,应将包围实体()视为可写(非只读S_t s1),但不应通过标准措辞将其视为可写(第2条在顶部),因为const现场_a。对于读代码的程序员,该标准不清楚,该赋值实际上是一个UB,因为无法分辨出struct S_s ... S_t类型的定义是不可能的。 此外,无论如何,仅以语法方式强制执行对该字段的只读访问。不可能const将非字段的某些部分const struct真正放置到只读存储中。但是这样的标准措辞使故意丢弃const这些字段的访问程序中的字段限定符的代码无效,就像这样(对C中的结构字段进行const限定是一个好主意吗?): (*) #include <stdlib.h> #include <stdio.h> typedef struct S_s { const int _a; } S_t; …
9 design  c 

2
访问控制的标准做法(设计模式)
我正在查看我的界面设计,并且在确定要访问的a user和a的情况下subject,我正在努力确定哪种方法是实现基于角色的访问控制的最“正确”方法user。 据我所知,我有三个核心选择(第四个是前三个的混蛋,第五个是第四个的调整): 使用subject具有以下权限的列表来查询user:subject.allowAccess(user.getPermissionSet) user使用subject所需的权限列表查询-user.hasPermissionTo(subject.getRequiredPermissions()) 查询第三方以找到权限的交集- accessController.doPermissionSetsIntersect(subject.permissionSet, user.getPermissionSet()) 查询subject/ user,同时将“决定”委托给第三方类 有user尝试访问subject,并抛出一个错误,如果不允许访问 我倾向于选项四-具有subject包含一个accessController字段,在其中调用subject.userMayAccess(User user)将操作委托给la: class Subject { public function display(user) { if(!accessController.doPermissionSetsIntersect(this.permissionSet, user.getPermissionSet())) { display403(); //Or other.. eg, throw an error.. } } } ..但这又引发了进一步的问题: 应该accessController是字段还是静态类..? 是否应该subject 知道查看权限需要什么权限? 关于召唤,最少知识的原理在哪里起作用subject.display()?subject.display()曾经的呼叫者应该知道访问控制有效吗?(subject.display()最终的“模板方法” 在哪里) 具有subject.display()管理访问控制,在用户没有所需权限的情况下引发异常? 在这种情况下,什么被认为是“最佳实践”?实际执行检查的责任应该在哪里发生? 由于这既是一项学术性的专业知识,其又将逐步发展为实施,因此将不胜感激对设计模式的引用。

3
从哪里加载和存储文件设置?
我认为这个问题应该适用于大多数从文件加载设置的程序。我的问题是从编程的角度来看的,实际上这是如何从不同的类和可访问性方面处理从文件中加载设置的问题。例如: 如果程序有一个简单的settings.ini文件,则应将其内容加载到load()类的方法还是构造函数中? 值应该存储在public static变量中,还是应该有static获取和设置属性的方法? 如果文件不存在或无法读取该怎么办?您将如何让程序的其余部分知道它无法获得那些属性? 等等 我希望在这里的正确位置提出这个问题。我想让问题尽可能与语言无关,但我主要关注的是具有继承性的语言,尤其是Java和C#.NET。

2
Haskell函数组合是管道和过滤器架构模式的实例吗?
管道和过滤器的架构模式定义为一系列处理元素,其排列方式是使每个元素的输出为next的输入。每个示例似乎都考虑通过某种共享缓冲区执行的进程间或线程间连接。 在我看来,Haskell函数组合正在执行相同的任务。我们能否说这只是此模式的一个实例,即使它只是关于函数排序,并且没有显式缓冲区用作管道?如果是,对于非惰性语言,我们可以说同样的话吗?

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发送到尚不存在的资源路径? 谢谢你的想法 杰拉德。

8
过去的If语句数组,循环…现在呢?
一年前,当我不断碰壁时,我放弃了编程。我正在重新研究该主题,因为我想创建基本的Android应用程序。但是我觉得我有限的知识是不够的。 这是我的问题。 我已经阅读了几本书,并观看了有关C#/ Java的视频教程,并跟随了示例,然后完成了这本书。最后,他们似乎总是让我对下一步该怎么做感到震惊。 这是什么意思,他们从基本的“ hello world”应用程序一直教您到if和array,然后看似希望您知道如何进入编码世界并创建任何东西。 我在这里想念什么吗?我知道这些是所有程序的基础,但我读过的书从未真正向我展示下一步该怎么做。 我想简单的答案是“开始编码”,但是在哪里?例如,我读过“ Head First Java”。直到他们告诉你把学到的一切都用来制作狗赛车游戏为止。 “不要欺骗并查看提供的源代码,您现在应该可以做到这一点。” _这不是确切的引用,但基本上就是我被告知的…… 半个小时前,他们只是在解释如何做数组,然后我毫无理论地打算创建一个工作游戏? 我之所以这样问,是因为我担心这至少是我应该知道的,至少开始编码了,但是感觉就像是给了我一个小工具箱,并被告知要建造一座摩天大楼。 谢谢你的建议

5
嵌套类是否被低估?
我并不是要说我知道其他人都不知道的东西,但是我一直在使用嵌套类来解决越来越多的设计问题,所以我很好奇这种使用似乎很少使用的可接受性的感觉设计机制。 这就引出了一个问题:我是因为某种原因而走上了一条固有的糟糕道路,当他们再次咬我时会发现它们的原因,还是嵌套类可能被低估了? 这是我仅将其用于以下两个示例:https : //gist.github.com/3975581-第一个示例帮助我将紧密相关的继承体系保持在一起,第二个示例使我可以向受保护的成员提供访问权限...
9 c#  design 

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.