2013-12-16 154 views
5

我有一個系統,在那裏我有一個household,其中有一個TVSubscription建模。這可以是一個digital,也可以是analogOO設計問題

user登錄到SetTopBox。然後他可以租用Movies

因此目前的方案如下:

//Existing instantiated variables in scope 
aMovie 
aUser 
aSetTopBox 
//End 

--> execute this command: 
aUser rent: aVideo on: aSTB 

Code: 
User>>rent: aVideo on: aSTB 
aVideo rentBy: self on: aSTB 

Video>>rentBy: aUser on: aSTB 
aUser rentActionMovie: self on: aSTB 

User>> rentActionMovie: aMovie on: aSTB 
aSTB rentActionMovie: aMovie by: self 

STB>>rentActionMovie: aMovie by: aUser 
(loggedInUser isNil) 
    ifTrue: [ loggedInUser := aUser. 
       --Do stuff to charge the movie] 
    ifFalse: [ -- Show error that user is not logged in] 

從技術上講,這是正確的。但我有(對不起,是肛門)這個問題:

我必須要通過aSTB 2種方法調用到最終使用它。需要在此雙重派遣,因爲我有ChildAdult,他們可以租AdultMovieChildrensMovie。因此我使用雙重調度來代替類型檢查(需求)。因此,我想到了以下解決方案:

我可以在aSTB上存儲currentlyLoggedIn,並在aSTB上存儲loggedInOn。然而,這使得對象指向彼此。

我的直覺告訴我,這是一個不好的氣味。我不確定如何修復它。

理想我願做這樣的事情:

aUser rent: aMovie. 

回答

1

我不是專家,只是替代了我的頭頂部...

STB>>initialize 
    aUser := UserNotLoggedIn new. 

STB>>rentMovie: aMovie by: aUser 
    (aMovie okayFor: aUser) 
     ifTrue: [ --Do stuff to charge the movie] 

AdultMovie>>okayFor: aUser 
    ^aUser canRentAdultMovie 

ChildrensMovie>>okayFor: aUser 
    ^aUser canRentChildMovie 

User>>canRentChildMovie 
    ^true 

User>>canRentAdultMovie 
    self displayErrorCannotRentAdultMovie 
    ^false 

Adult>>canRentAdultMovie 
    ^true 

UserNotLoggedIn>>canRentChildMovie 
    self displayErrorUserNotLoggedOn 
    ^false 

UserNotLoggedIn>>canRentAdultMovie 
    self displayErrorUserNotLoggedOn 
    ^false 

Child "just the same as User" 

User>rent: aMovie. 
    aSetTopBox rentMovie: aMovie by: self. 

aUser租金:aMovie。

1

思想

這麼多的兩個對象之間的關係, 那麼它可能是你想將關係建模爲對象

一個目的是anything that is visible or tangible and is relatively stable in form.

實現思路

您創建一個臨時的對象,只要它僅作爲生活在兩個物體之間的關係。如果需要,該對象可以充當中介或方法對象。

我的感覺是,它可能是過度設計,而不是馬上由誰讀碼的人瞭解情況。

+0

好了,這是一個過程,我採取的分配。我也有過度的工程感覺..我可能會嘗試使用中介來建模關係。 –

2

第二個選擇...

STB>>initialize 
    aUser := UserNotLoggedIn new. 

STB>>login 
    aUser := self getUserFromAuthorisationCheck 

STB>>rentMovie: aMovie by: aUser 
    (aUser canRent: aMovie) 
     ifTrue: [ --Do stuff to charge the movie] 

UserNotLoggedIn>>canRent: aMovie 
    self displayErrorUserNotLoggedOn 
    ^false 

User>>canRent: aMovie 
    aMovie ratingAge <= self ratingAge. 

AdultMovie>>ratingAge 
    ^18 

Adult>>ratingAge 
    ^18 

ChildrensMovie>>ratingAge 
    ^10 

Child>>ratingAge 
    ^10 

User>>rent: aMovie 
    aSetTopBox rentMovie: aMovie by: self