Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net OO右模式_.net_Oop - Fatal编程技术网

.net OO右模式

.net OO右模式,.net,oop,.net,Oop,两位开发人员就哪种模式是正确的存在争议。如果有人能告诉我谁是对的,为什么,我会很高兴 开发者1: a类有两个功能: Remove(int item); Save(); 理由: a.Remove(1); a.Remove(3); a.Save(); a.Remove(new List<int>{1,2}); 通过这种方式,您可以从其内部列表中删除项,而无需将更改保存到数据库。只要调用.Save(),对象的内部状态就会保存到数据库中 开发者2: 类只有一个函数 Remove(Lis

两位开发人员就哪种模式是正确的存在争议。如果有人能告诉我谁是对的,为什么,我会很高兴

开发者1:

a类有两个功能:

Remove(int item);
Save();
理由:

a.Remove(1);
a.Remove(3);
a.Save();
a.Remove(new List<int>{1,2});
通过这种方式,您可以从其内部列表中删除项,而无需将更改保存到数据库。只要调用.Save(),对象的内部状态就会保存到数据库中

开发者2:

类只有一个函数

Remove(List<int> items);
删除(列表项);
理由:

a.Remove(1);
a.Remove(3);
a.Save();
a.Remove(new List<int>{1,2});
a.Remove(新列表{1,2});
这样,您就不必记住保存,类a仍然只能保存一次


是否有设计模式或其他文件证明了正确的方法,还是仅仅是风格?

由于这是一个非常综合的例子,在不了解真实背景的情况下,很难判断什么是正确的方法


在大多数实际情况下,第一种解决方案更好,因为需要减少数据库请求数量和持续时间

看看存储库和工作单元模式

常见的活动顺序是:

  • 创建工作单元
  • 使用存储库(映射到UoW)对数据执行一些操作
  • 使用存储库对数据执行其他操作
  • 通过工作单元提交更改
  • 根据工作单元的实施情况,您可以

  • 在开始时创建物理事务(或连接),并立即推送更改。它是第二种解决方案的灵活等价物
  • 创建物理事务并在UoW.commit结尾处提交
  • 实现不同的脱机锁(悲观锁或乐观锁)
  • 所以,它是自由的。单一方法解决方案的灵活性较低,尤其是当您需要添加另一个操作时,即

    Remove(1,2);
    Add(5);
    

    谈到数据访问和域层,从长远来看,它可能会导致数据库逻辑泄漏和其他当前被认为是反模式(大多数情况下)的事情,如活动记录。

    第二种情况有两个职责:删除和保存。因此,我更喜欢第一种情况。在后一个示例中,您不需要记住如何保存,您的语句中没有任何内容表明“Remove”也会持续存在于数据库中;这是一个偏好问题:为了灵活性,我不明白为什么这两种方法都不公开,但“保存”是作为“删除”的一部分发生还是显式地单独发生是特定于您的场景的设计决策-尽管第二种情况隐藏了后果,这可能是不受欢迎的。这个问题应该出现在programmers.stackexchange.com或codereview.stackexchange.com上。注意,像EF和NHibernate这样的ORM对正常操作使用模式#1,对批处理/直接操作使用不同的函数(甚至接口),如果您将来要添加函数(如Update或Insert)或执行保存到数据库的任何函数,并使用后一种方法,而不是误用已用于其他目的的函数名,那么这不会导致每个函数中保存的代码重复吗?“在大多数实际情况下,第一种解决方案更好,因为需要减少数据库请求数量和持续时间。“-答案正确,主要原因错误。@MitchWheat,解释一下。您喜欢包含关于责任、可维护性、可靠性等复杂和煽动性理由的答案吗?我甚至不会根据这个特定的案例来谈论一般的设计原则。一些技术材料(事务、日志、其他“副作用”…)可以透明地应用于不同的操作。因此,只要正确、跨协议地实施了更改和立即保存本身就不是问题(当然,这也是实际需要所必需的)。此外,一些框架不需要明确的“保存”并在每次模型更改时推动更改。