我刚刚回答了一个与SRP有关的问题让我想到:SRP如何站在实用工具类上?
根据定义,实用程序类往往会做很多事情.我可以看到单个接入点上的gatering相关实用程序是如何有用的.按照SRP标准,您无法在一个类中实现实用程序.这是否意味着实用程序类是禁止的,或者SRP是否允许它,如果它只是多个类的外观,每个类都遵循SRP?
SRP负责人说:
一个类或模块应该只有一个改变的理由
我有一些Facade类作为我的服务层类.例如SaleService,它提供了一些方法,例如SaveOrder(),CancelOrder(),CreateOrder(),GetAllOrders(),GetAllPlannedOrders(),...
我只是因为他们的概念关系而把它们放在一起.
使用这种方法的类可能有多个改变()的原因,违反了SRP吗?如果是的话,我该如何处理这个问题呢?
design-patterns single-responsibility-principle facade conceptual service-layer
我必须将运行sql查询后生成的行写入文件.
# Run the SQL script.
my $dbh = get_dbh($source);
my $qry = $dbh->prepare("$sql_data");
$qry->execute();
# Dump the data to file.
open(my $fh_write, ">", "$filename");
while (my @data = $qry->fetchrow_array())
{
print {$fh_write} join("\t", @data) . "\n";
}
close($fh_write);
Run Code Online (Sandbox Code Playgroud)
显然,我在一个函数中做了两件事:
有没有办法使用SRP来做到这一点?
数据中有很多行,因此从单独的函数返回行数组可能不太好.
这是在我们的一次回顾中提出的,并希望获得一些额外的反馈和抽查.我们目前有许多基于布尔标志启用/禁用的视图(Model.IsNew是一个例子).我认为视图应该尽可能简单,控制器应该确定该视图的数据,而不一定是它的工作原理.我认为部分或全部的观点应该是 - 应该做什么和处理与确定应该显示/隐藏的内容的视图.一个非常基本的例子如下,但涵盖了这两方面,主要反映了我们所拥有的......
控制器有一对名为Details的方法(post/get).[Get] Details有一个参数,Id和[Post] Details接受id和viewmodel.在帖子中,该方法长约30行,检查有效模型,确定其是否为新,如果某个值发生了变化(触发重定向)等等(我认为这是不正确的).[Get] Details检查空id,填充必要的下拉菜单,没什么花哨的(我认为这是对的).详细视图本身包含一小部分逻辑:If(!Model.IsNew){RenderAction(History => History.Show(id);}(我认为这在if中是不正确的,Show应该知道要显示什么,无论它是否新的).加上这个是所述详细信息视图的布局没有完成两次.详细信息/添加几乎相同,
思想,观点,见解?
asp.net-mvc design-patterns dry single-responsibility-principle
在ASP.NET MVC中,在[HttpPost]方法上,MVC运行时将根据字段名称自动映射前端表单字段中的数据并将其传输到视图模型中.
如何在ASP.NET WebForm中完成相同的操作?
例如,我有一个名为Person的对象,具有FirstName和LastName属性.
我有一个WebForm页面,文本框控件分别带有FirstName和LastName.
当在表单上按提交时,有没有办法在代码隐藏的Button_Click事件中自动将FirstName和LastName绑定到Person对象?
asp.net-mvc webforms dry single-responsibility-principle model-binding
您如何决定何时以及如何违反单一责任原则?
例如,假设我有一个具有以下接口的网络摄像机(为了简单起见,接口保持愚蠢和“错误”):
class Camera
{
string user();
void set_user(string user);
string password();
void set_password(string password);
string url();
void set_url(string url);
image take_snapshot();
bool reboot();
}
Run Code Online (Sandbox Code Playgroud)
这看起来很自然,但看起来 Camera 类有 3 个职责:存储元数据、拍摄快照、重新启动。按照SRP,你可以这样写:
class Camera
{
string user();
void set_user(string user);
string password();
void set_password(string password);
string url();
void set_url(string url);
}
image take_snapshot(camera c);
bool reboot_camera(camera c);
Run Code Online (Sandbox Code Playgroud)
这里的东西在职责方面被整齐地分开,但现在它看起来非常像具有愚蠢结构和函数的 C...这引出了一个问题:为什么我们首先需要 OOP。
您如何在便利性和建议零售价之间取得平衡?
[编辑]
@stjin 的想法被@John Zwinck 显示为答案
c++ coding-style single-responsibility-principle design-principles
因此在通量架构中,数据流如下:
View -> Action -> Dispatcher -> Store
^ <-----------------------------|
Run Code Online (Sandbox Code Playgroud)
所以我们假设视图是一个评论框.当用户提交注释时,会触发addComment操作,但该注释应该在何处发送到服务器?它应该在动作函数中发生,发送之前,还是商店在收到调度员的动作时这样做?
这两种情况都像是违反单一责任模式.或者是否应该有两个CommentStore,一个LocalCommentStore和一个ServerCommentStore都处理addComment操作?
javascript architecture single-responsibility-principle reactjs-flux
我了解许多设计原则在某些情况下会相互冲突。因此,我们必须权衡它们,看看哪个更有利。直到现在,我才意识到SRP原理,并仅以此为基础进行了很多设计,但在内部,遵循该原理有时会感到不对。现在我开始了解TDA,对此我的感觉得到了更多支持:)
SRP:-对象应该担心自己的关注而不是其他人
TDA:-行为(仅取决于其对象状态)应保留在对象本身内部
示例:- 我有不同的形状,如矩形,正方形,圆形等。现在我必须计算面积。
到目前为止,我的设计是:-我遵循SRP,这里有AreaCalculatorService类,该类将询问形状状态并计算面积。该设计背后的理由是形状不应该担心面积计算,因为它不是形状责任。但是理想情况下,我曾经以为区域计算代码应该驻留在每个形状下,如果出现新形状,就好像在线下一样,我必须修改AreaCalculatorService类(这违反了Open的扩展名和闭合的修改原则(OECM))。但始终优先考虑SRP。好像错了
神话被打破了(至少是我的):-使用TDA,我的感觉是正确的,在这里我不应该询问物体的状态,而要告诉形状以计算其面积。尽管它将违反SRP原则,但将支持OECM原则。正如我所说的那样,设计原则有时会相互冲突,但是我相信行为完全取决于其对象状态,行为和状态应该在一起。
另一个示例:-说我必须计算组织中所有雇员的所有部门的薪水,那么我们应该遵循SRP,SalaryCalculatorService将取决于部门和雇员。
它将询问每个员工的薪水,然后对所有薪水进行汇总。因此,我在这里要求员工的状态,但仍不违反TDA calcSalary不仅取决于每个员工的薪水。
让我知道我对这两个原则的解释是否正确,在第一种情况下应遵循TDA,在第二种情况下应遵循SRP?
oop single-responsibility-principle tell-dont-ask design-principles
single-responsibility-principle ×8
asp.net-mvc ×2
dry ×2
architecture ×1
c++ ×1
coding-style ×1
conceptual ×1
facade ×1
javascript ×1
oop ×1
perl ×1
reactjs-flux ×1
tdd ×1
webforms ×1