代码之家  ›  专栏  ›  技术社区  ›  Chris Van Opstal

OOP最佳实践:employee.getcars()与cars.getbyemployee()。

  •  6
  • Chris Van Opstal  · 技术社区  · 14 年前

    给了班 Company , Employee Car 检索与公司或员工相关的汽车的首选方法是什么?

    Employee.GetCars(params...)
    Company.GetCars(params...)
    

    或:

    Cars.GetByEmployee(params...)
    Cars.GetByCompany(params...)
    

    第一种方法是我通常使用的方法,对我来说总是最直观的。但在看到使用第二种方法的大型代码库之后,我不得不承认它在我的基础上不断增长。我真正喜欢第二种方法的两件事是:

    • 它分组所有 小型车 将相关代码合并成一个文件,使代码更模块化,更易于维护。
    • 任何返回值为的方法都有一个直观的逻辑 小型车 (或者更像 List<Car> 在本例中)分组到 小型车 班级。

    是否有涵盖这一点的最佳实践?

    8 回复  |  直到 14 年前
        1
  •  6
  •   tobiasbayer    14 年前

    我将使用实体类中的第一种方法。这些方法不应该有参数,因为它们只返回所有关联。 第二种方法涉及一些简单的业务逻辑,应该放在一个助手类中,或者如果您有一个,也可以放在万向节中。

        2
  •  2
  •   RoflcoptrException    14 年前

    我认为没有单一的解决方案。这取决于你怎么争论。如果是汽车的责任人知道他们是谁拥有的,我会使用第二种方法。但是如果员工有责任知道他有哪些车,那么我会使用第一种方法。

    然而,我个人更喜欢第一种方法,因为它似乎更容易实现。

        3
  •  2
  •   user395760    14 年前

    雇员 有一个 汽车(或一些汽车,就这点而言),所以每个员工都很自然地知道他使用的汽车。但是这辆车知道还是在乎谁拥有它?我会说不,可能知道是谁开的,但这是另一个问题。

    要么汽车知道是哪个员工拥有它(这感觉不对,这是一种奇怪的关系),要么它必须搜索所有员工才能找到自己,这更糟糕(不合逻辑,狗慢,除了松耦合以外的一切)。

        4
  •  2
  •   Peter Ruderman    14 年前

    我觉得这两种方法都有点离谱。为什么员工班要知道汽车班?为什么汽车班要了解员工?两个类都不需要另一个类来运行,因此不需要耦合它们。我只需要在某个地方存储一本字典,将员工映射到一组汽车上,另一本字典将公司映射到一组汽车上。

        5
  •  1
  •   anon    14 年前

    没有最好的办法。这取决于应用程序需要做什么。使用相同数据的两个应用程序可以拥有完全不同的对象模型,这取决于它们的用例。

        6
  •  1
  •   Jerod Houghtelling    14 年前

    通过德米特逻辑处理定律来解决这个问题。很有帮助,对吧!和合

    这个问题是以一种在员工和汽车类之间总是有耦合的方式提出的。如果你能改变 car.GetByEmployee(...) car.GetByDriversLicenseNumber(...) (或者类似的东西)然后你将把这两个类分离。

    最好的方法是减少耦合在一起的对象的数量。所以,这一切都取决于链中的下一级对象将如何处理汽车。

    我认为这个问题没有一个正确的答案,这一切都是关于目前的情况。

        7
  •  0
  •   user1342582    14 年前

    两者都不。

    调用一个接口 ICarOwner 它是由 Employee Company (或其派生),然后创建类 CarOwnership 带属性 Car (类型) 小型车 ICar ) Owner (类型) 冰岛主 )

    当你需要找到汽车所有权时,你不需要关心车主是雇员还是公司。你只需要做 CarOwnerships.GetByOwner(ICarOwner) .

    我希望这有帮助。

        8
  •  -1
  •   InsertNickHere    14 年前

    一切都是为了缓和关系。一个员工可以拥有多辆车吗?(1:n)不要从n面引用1面,这是我老师说的。其他事情也一样。如果你有1:1,你可以两者兼得。employee.getcar和car.getowner;-)