Questions tagged «single-responsibility»

单一责任原则指出,系统中的每个模块都应负责单个功能或功能,或聚合功能的集合。另一种通用的表达方式是说每个模块应该只有一个更改的理由。

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

6
实施SRP的实际方法是什么?
人们简单地检查班级是否违反单一责任原则的实用技术是什么? 我知道一个班级应该只有一个改变的理由,但是那句话在某种程度上缺乏真正实现这一改变的实用方法。 我发现的唯一方法是使用句子“……本身应该……”。其中第一个空格是类名称,第二个空格是方法(职责)名称。 但是,有时很难确定责任是否确实违反了SRP。 还有更多检查SRP的方法吗? 注意: 问题不在于SRP意味着什么,而是关于检查和实施SRP的实用方法或一系列步骤。 更新 我添加了一个明显违反SRP的示例类。如果人们可以以此为例来说明他们如何遵循单一责任原则,那将是很好的。 这个例子是从这里开始的。

4
面向对象编程中的主要职责是什么?
我是面向对象编程的新手,但我不明白主对象的目的是什么。 是的,我读到它是程序的“入口点”,但是我不明白的是程序的主要内容是什么?它的职责是什么? 可能会发生将主体编写的内容封装到另一个对象中的情况,但是您应该使用这种方法多少呢? 这是我用Java编写的第一个主语言,它很简单,但是可能会让您更好地理解我的疑问。我有一个抽象类Animal,它由“ Cat”和“ Dog”扩展。我使用main来创建一些对象,并使用它作为与用户的“接口”,确实如您所见,我使用了一些条件指令来“询问用户”他想做什么。 我的问题来自于这样一个事实,即接口可以封装在另一个对象中,而不是把责任交给主要对象。 public static void main(String[] args) { Scanner input = new Scanner(System.in); System.out.println("What type of animal do you want to create? \n dog cat"); String type = input.nextLine(); if ( Objects.equals(type, "dog")){ System.out.println("Enter the animal's age: "); int age = input.nextInt(); // Scans the …

3
责任分担后如何管理单一责任?
我有两堂课,Operation和Trigger。每个类都有许多专门用于某些类型的操作或触发器的子类。一个Trigger可以触发特定的Operation。虽然Operation可以由特定触发Trigger。 我需要编写将给定映射Operation到给定Trigger(反之亦然)的代码,但是我不确定将其放置在何处。 在这种情况下,代码显然不属于一个类或另一类。因此,就单一职责原则而言,我不确定代码应属于何处。 我可以看到三个选项都可以使用。虽然1和2似乎只是语义的选择,但3和3完全代表了一种不同的方法。 触发时,例如bool Triggers(Operation o)。 关于操作,例如bool TriggeredBy(Trigger t)。 在管理映射的全新类中,例如bool MappingExists(Trigger t, Operation o)。 我应该如何根据单一责任原则决定将共享映射代码放置在何处? 责任分担后如何管理单一责任? 编辑1。 因此,实际代码如下所示。所有属性,或者是一string,Guid,collection<string>,或enum。它们基本上只是代表一小部分数据。 编辑2。 返回布尔类型的原因。另一个类将使用Trigger和的集合Operation。它需要知道在Trigger和之间存在映射Operation。它将使用该信息来创建报告。

2
遵循SRP时,应如何处理验证和保存实体?
最近,我一直在阅读Clean Code和各种有关SOLID的在线文章,而我阅读的内容越多,我感觉自己一无所知。 假设我正在使用ASP.NET MVC 3构建Web应用程序。假设我有一个类似这样UsersController的Create操作: public class UsersController : Controller { public ActionResult Create(CreateUserViewModel viewModel) { } } 在这种操作方法中,如果输入的数据有效,我想将用户保存到数据库中。 现在,根据“单一责任原则”,对象应具有单一责任,并且该责任应由类完全封装。它的所有服务都应严格地与这一责任保持一致。由于验证和保存到数据库是两个单独的职责,我想我应该创建一个单独的类来像这样处理它们: public class UsersController : Controller { private ICreateUserValidator validator; private IUserService service; public UsersController(ICreateUserValidator validator, IUserService service) { this.validator = validator; this.service= service; } public ActionResult Create(CreateUserViewModel viewModel) { ValidationResult …

2
单一责任和自定义数据类型
在过去的几个月中,我一直要求SE和其他网站上的人员给我一些有关我的代码的建设性批评。一件事几乎每次都会弹出,我仍然不同意这个建议。:P我想在这里讨论它,也许事情对我来说会变得更加清楚。 它与单一责任原则(SRP)有关。基本上,我有一个数据类,Font它不仅包含用于处理数据的函数,而且还用于加载数据。有人告诉我这两个应该分开,加载函数应该放在工厂类中。我认为这是对SRP的误解。 我字体类的片段 class Font { public: bool isLoaded() const; void loadFromFile(const std::string& file); void loadFromMemory(const void* buffer, std::size_t size); void free(); void some(); void another(); }; 建议设计 class Font { public: void some(); void another(); }; class FontFactory { public: virtual std::unique_ptr<Font> createFromFile(...) = 0; virtual std::unique_ptr<Font> createFromMemory(...) = …

7
我是否使我的课程过于细腻?单一责任原则应如何应用?
我编写了许多涉及三个基本步骤的代码。 从某处获取数据。 转换数据。 将该数据放在某处。 我通常最终使用三种类型的类-受它们各自的设计模式的启发。 工厂-从某些资源构建对象。 调解员-要使用工厂,执行转换,然后使用指挥官。 指挥官-将数据放在其他地方。 我的班级往往很小,通常是一个(公共)方法,例如获取数据,转换数据,执行工作,保存数据。这导致类的激增,但总体上效果很好。 我在进行测试时遇到的困难是,我最终会紧密耦合测试。例如; 工厂-从磁盘读取文件。 指挥官-将文件写入磁盘。 没有其他人,我无法测试。我可以编写其他“测试”代码来进行磁盘读/写操作,但是随后我要重复一遍。 看看.Net,File类采用了不同的方法,它将(我的)工厂和指挥官的职责结合在一起。它具有“创建”,“删除”,“存在”和“全部读取”功能。 我是否应该遵循.Net的示例并将我的类结合在一起(尤其是在处理外部资源时)?它仍然耦合了代码,但是它更具故意性-它发生在原始实现中,而不是在测试中。 我在这里是否过于狂热地应用了“单一责任原则”?我有负责读和写的单独的类。当我可以拥有一个负责处理特定资源(例如系统磁盘)的组合类时。

3
API对象定义包含第三方引用ID作为属性是否不好?
像这样: Campaign: type: object properties: id: type: string description: "A GUID identifier" referenceId: type: string description: "A consumers identifier they have used to map their own systems logic to this object." name: type: string description: "'Great Campaign 2017' as an example" 我担心referenceId。 系统域是一个平台,该平台通过数据导出和各种格式(xml,excel)的导入以多种方式与第三方集成。它已经足够成熟,可以允许第三方通过API与我们的系统集成,而该API的设计正是引发这一问题的原因。 我们有一个名为Campaign的对象,该对象的ID可用于识别和检索资源。我们API的消费者可能在自己的域内拥有自己的参考代码,以作为他们认为是广告系列的参考代码。 我们系统中还有其他带有第三方参考字段的对象,这是我们现有消费者所期望的。但是我担心这给我们增加了映射的负担,我们不知道这个referenceId是什么(数字,文本,json?),并且为新使用者增加了另一个令人困惑的属性。 在API的公共对象定义中允许第三方引用ID字段被视为不良做法或不良设计?

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()管理访问控制,在用户没有所需权限的情况下引发异常? 在这种情况下,什么被认为是“最佳实践”?实际执行检查的责任应该在哪里发生? 由于这既是一项学术性的专业知识,其又将逐步发展为实施,因此将不胜感激对设计模式的引用。

2
是否有“只问您需要”的界面原则?
我已经成长为使用一种设计和使用接口的原理,该原理基本上说:“只问您需要什么”。 例如,如果我有一堆可以删除的类型,我将创建一个Deletable接口: interface Deletable { void delete(); } 然后,我可以编写一个通用类: class Deleter<T extends Deletable> { void delete(T t) { t.delete(); } } 在代码的其他地方,我总是要求最小的责任来满足客户代码的需求。因此,如果我只需要删除一个File,我仍然会要求一个Deletable,而不是一个File。 这个原则是常识并且已经有公认的名称吗?有争议吗?在教科书中讨论过吗?
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.