gpt4 book ai didi

c# - 传递父对象作为父对象交互的引用的做法是邪恶的吗?

转载 作者:太空狗 更新时间:2023-10-29 23:32:05 26 4
gpt4 key购买 nike

在我最近做的一些遗留 c# 代码的代码审查中,我看到了很多这样的例子:

class ManagerParentClass
{
public string CustomProperty{get;set;}
public void Log(string message);

void DoABunchOfTasks()
{
new SomethingService().DoSomething(this);
}
}

具有以下内容:

public class SomethingService
{
ManagerParentClass _manager;

void DoSomething(ManagerParentClass manager)
{
_manager = manager;

// do something
_manager.CustomProperty = "hello world";
_manager.Log("said hello world");
}
}

虽然这在表面上工作得很好,但我担心这有点反模式,可能会导致垃圾收集的不良后果。

这是否会破坏 .Net 中的分代垃圾收集器正确清理父对象和子对象的能力或其他任何负面影响?

最佳答案

哦,是的,这通常是一个可怕的反模式。我使用的代码库经常使用它,这简直是疯狂。

最大的冒犯?违反封装以及随之而来的类之间的紧耦合:SomethingServiceManagerParentClass了解太多,ManagerParentClass放弃了对自己的控制到 SomethingService

两个更好的选择:

  1. 使DoSomething()成为ManagerParentClass的实例方法,这更符合面向对象的一个​​要点:数据结构携带它们的运算符
  2. 使 SomethingService 成为一个方法,该方法进行一些计算并返回一个值,然后调用者可以将分配给 ManagerParentClass<

当然,这两种重构都涉及 ManagerParentClass 的最终突变,从函数式编程的角度来看,我会尽量避免这种情况。但是,如果没有更多信息,我无法为此推荐一门类(class)。

关于c# - 传递父对象作为父对象交互的引用的做法是邪恶的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17386683/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com