JavaOO——一个提供与其他对象交互的新方法的对象?

JavaOO——一个提供与其他对象交互的新方法的对象?,java,terminology,Java,Terminology,假设我有一个列表对象,每个苹果都有一种颜色 我实现了另一个使用其输入构建的对象,即apple对象列表。我可能会在这个对象上实现一些功能,比如“给我一些绿苹果”,我可以在不知道该对象的内部表示的情况下调用它 你怎么称呼这个人?它看起来像是基本的OO,但我很难想出一个描述性的名称 既然您谈论的是列表,那么很可能您也在谈论集合(列表继承集合) 如果你想强调“收藏”,那么我将命名为“收藏”。苹果传统上是以蒲式耳为单位销售的,但你不关心测量,所以我会使用更通用(不依赖大小)的术语“篮子” 这恰当地抓住了计

假设我有一个
列表
对象,每个苹果都有一种颜色

我实现了另一个使用其输入构建的对象,即apple对象列表。我可能会在这个对象上实现一些功能,比如“给我一些绿苹果”,我可以在不知道该对象的内部表示的情况下调用它


你怎么称呼这个人?它看起来像是基本的OO,但我很难想出一个描述性的名称

既然您谈论的是
列表
,那么很可能您也在谈论
集合
(列表继承集合)

如果你想强调“收藏”,那么我将命名为“收藏”。苹果传统上是以蒲式耳为单位销售的,但你不关心测量,所以我会使用更通用(不依赖大小)的术语“篮子”

这恰当地抓住了计算篮子中绿苹果的责任

另一方面,实用程序似乎将任务的责任与特定类型绑定对象分离。例如,让我们看一个假设的
AppleCounterUtil

public class AppleCounterUtil {

    public int getCount(Collection<Apple> apples, AppleCondition condition) {
        int count = 0;
        for (Apple apple : apples) {
            if (condition.isSatisfied(apple)) {
               count++;
            }
        }
    }

}
变得非常笨重,但由于我们是面向对象的,我们可以很容易地向
篮子中添加
篮子侦听器
接口

public class Basket {

   public void addListener(BasketListner listener) {
     ...
   }

   public void addApple(Apple apple) {
     ...
     for (BasketListnener listner : listeners) {
       listener.appleAdded(this);
     }
   }

}

... some other class ... implements BasketListener {

   int greenOnes = 0;

   ...

   public void appleAdded(Basket basket) {
      greenOnes = basket.getGreenAppleCount();
   }
}
而使用面向实用的技术

...
int greenOnes = AppleCounterUtil.getCount(apples, new GreenCountCondition());
apples.addApple(new GreenApple());
greenOnes = AppleCounterUtil.getCount(apples, new GreenCountCondition());
...
表面上看起来很相似,直到您尝试添加更多功能。在尝试添加“apple list listener”时,您很快就会意识到,
AppleCounterUtil
不负责维护计数,因此无法收听。“苹果列表”也不负责维护计数,一般化列表通常为监听提供错误的接口

不幸的是,当一个人变得面向实用时,他们通常会尝试通过添加更多实用方法来解决问题。这最终可能意味着特定的关注点(谁管理苹果组)可以在许多实用程序之间分配,而没有任何实用程序单独负责该任务。每个实用程序只提供一些可根据需要计算的“功能”


在某些情况下,按需计算功能可能会依赖于其他按需计算功能,从而在两者之间实现功能耦合(即使没有直接的代码耦合)。这种有效的耦合意味着,如果您未能按顺序调用某一组实用程序,或者忽略了所需的实用程序调用,那么代码就会中断。一种极端情况是,对象最终会失去其行为,以至于成为数据结构,或者缺少通常与对象关联的行为。它是一种面向对象的设计反模式,称为“贫血对象”

这个
对象是什么?比如说,如果它是一个篮子,那么
basket
就可以了。如果你有一个
学童
,并且你有一些容器存放
集合
,那么可能
学校
。选择描述
对象的角色的内容。AppleSupervisor?园丁?AppleOverseer?SteveJobs?Bob叔叔建议不要使用“经理”、“处理器”等毫无意义的术语——我倾向于同意他的观点。在谷歌上搜索“访客模式”。实现一个访问者。一个“实用方法包”?我将所有这些方法都设置为静态,并将其称为实用程序类。对于类名本身,它可能是
AppleUtilities
Apples
(基于JDK中的标准
数组和
集合
类)。
public class Basket {

   public void addListener(BasketListner listener) {
     ...
   }

   public void addApple(Apple apple) {
     ...
     for (BasketListnener listner : listeners) {
       listener.appleAdded(this);
     }
   }

}

... some other class ... implements BasketListener {

   int greenOnes = 0;

   ...

   public void appleAdded(Basket basket) {
      greenOnes = basket.getGreenAppleCount();
   }
}
...
int greenOnes = AppleCounterUtil.getCount(apples, new GreenCountCondition());
apples.addApple(new GreenApple());
greenOnes = AppleCounterUtil.getCount(apples, new GreenCountCondition());
...