簡體   English   中英

現實生活中Java OO類的發型設計示例

[英]Java OO class design example of haircut in real life

伙計們,我是OOP的新手。 我想設計OO類來表示人類如何執行理發動作

我有這樣的初始類藍圖:

class Human {
    Human(){}
    class Hair{
        private int length;
        Hair(){
            this.length=10;
        }
    }
}
class Tools{
    Tools(){}
    class Scissors{
        Scissors(){}
    }
}
class HoldingScissors{
    public void makeHairCut(Human theHuman){
        theHuman.Hair.length = 5;
    }
}

但是,我不知道如何鏈接它們之間的關系。 我希望人類先“抓住”剪刀,然后才能進行理發。 有人可以告訴我如何實現這一目標嗎?

HoldingScissor可能不應該是一個類,而應該是一個允許執行動作類的屬性。

但是,有100萬種方法可以對此進行建模。 OO有兩件事:消息傳遞和封裝; 不要僅僅關注對象粒度,因為您將追求錯誤的抽象

abstract class Action {
  public void perform();
}


public class CutHairsAction {

 Human agent,target;

 public  CutHairsAction(Human agent, Human target) {
   if (agent.getHolding() == null) throw new IllegalStateException("agent not holding scissors"); 
   if (! agent.getHolding() instanceOf Scissor) throw new IllegalStateException("agent not holding scissors"); 
 if (target.Hair.lenght < 5) throw new IllegalStateException("target hair short enough"); 

   this.target = target;
   this.agent = agent;
 }

 public void perform() {
 target.Hair.length = 5;
 }
}

我認為您在這里缺少一些課程(更不用說這些課程應該是公開的,而不是您編寫的內部課程)。 應該有一個Human的子類,稱為Barber (或者說Stylist )。 只有理發師應該被允許更改該人的發型(和特定的人可以采取“理發師”的卷-包括去理發的人-嘿人剪自己的頭發所有的時間!)。

我認為,除非您打算對剪刀的行為建模(定義簡單的概念很顯然,您並不打算對剪刀的實際作用進行建模),否則定義剪刀類是過大的選擇。 取而代之的是,理發師(或發型師)應該能夠直接修改人的發型(讓我們保持真實感—實際上就是這里的頭發長度)。 在現實生活中,一個理發師可以用剪刀(或剪羊毛),但你是不是這種建模的一部分 ,所以它是多余創建剪(或剪羊毛)類。

如果要合法地擁有Scissors (或剪床)類,則需要區分不同剪刀(或剪床)剪發的方式。 如果沒有這種區別,那么擁有該類就沒有意義。 例如,呆滯的剪刀剪發的方式可能與鋒利的剪刀不同。 因此,如果理發師使用鈍剪刀(或等級為“鈍”)的理發師,可能會使用不同的剪刀對同一理發師進行不同的剪裁-如果它們剪一樣,那么您就無需建模剪刀,因此不需要Scissors類/對象。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM