【问题标题】:What anti/pattern involves repeatedly passing around the same parameters?什么反/模式涉及重复传递相同的参数?
【发布时间】:2012-03-22 22:32:50
【问题描述】:

假设我有一些代码...

House = function () { /* constructor */ }

House.childPlay  (childId) { ... }
House.childLearn (childId) { ... }
House.childEat   (childId) { ... }

因此,隐含地,这个 House 对象“有”孩子,但它不一定有 Child 对象。这就是我想知道的。 childId 的不断传递似乎很可疑。 House 是否应该拥有一组 Child 对象?

House.Child.play  () { ... }
House.Child.learn () { ... }
House.Child.eat   () { ... }

我唯一担心的是,某些操作位于 House 和 Child 之间,就像它们互动一样。因此,子对象需要对父对象有某种认识。

House.Child.clean () {
    self._cleaningStrategy( self.house._provideMop() );
}

我看到有一种称为参数对象的设计模式。是这个吗?我想如果我要传递一个元组的参数值,但这里我只传递一个。

【问题讨论】:

  • 那么,您有什么顾虑?传递此 id 对您的代码有何影响?
  • 一个同样有效的问题可能是“为什么房子不属于孩子?” ...但你还没有告诉我们为什么不能这样。猜猜是因为孩子没钱。
  • 是的,不断传递相同的参数太冗长/笨拙,还有更好的方法。
  • @SanJacinto 没有什么能阻止孩子拥有房子。我只是还没有实现它,这正是我要问的。没有限制。
  • 问题不可能回答。虚构的非代码相关示例很难讨论。真实的例子更有可能吸引真实的答案。

标签: oop design-patterns language-agnostic parameters refactoring


【解决方案1】:

听起来孩子的行为与房子无关(应该如此)。如果我们想让孩子吃饭,那与房子无关,所以这是要走的路:

Child.Eat();

如果我们想让孩子打扫房子,听起来我们应该这样做:

Child.CleanHouse(house);

这样,孩子也有可能打扫另一间房子;不仅仅是一所房子。

CleanHouse() 可能如下所示:

Mop mop = house.GetMop();
// Perform cleaning activities here.

我同意您对房屋对象具有儿童行为的担忧。这违反了OOP 单一职责原则(house 应该只做house 的事情)和Information Expert 的设计思想(拥有履行职责所需的信息的类)。 House 应包含特定于房屋的行为,而 Child 应包含特定于子级的行为,否则它们的耦合太紧密了。

我不知道这是一个设计模式问题,而是一个 OOP 问题。

【讨论】:

  • 我猜这比 House.EatChild() 好。 :o)
  • 在一些恐怖电影中,我很确定房子会吃掉孩子。并非闻所未闻!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-29
  • 2015-12-31
  • 2016-04-14
  • 2015-08-15
相关资源
最近更新 更多