OO设计问题

5

我有一个系统,需要对“家庭”进行建模,每个家庭都有一个“电视订阅”。这可以是数字订阅或模拟订阅。

用户登录机顶盒后,可以租用电影。

因此,当前的方案如下:

//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 两个方法调用传递下去才能使用它。这里需要双重分派,因为我有 ChildAdult,他们可以租用 AdultMovieChildrensMovie��因此,我使用双重分派而不是类型检查(要求)。因此,我想到了以下解决方案:

我可以��� aSTB 上存储 currentlyLoggedIn 并在 aSTB 上存储 loggedInOn。然而,这会使对象相互引用。

我的直觉告诉我这是一个不好的迹象。虽然我不知道如何解决它。

理想情况下,我想做类似于这样的事情:

aUser rent: aMovie.
3个回答

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

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.

用户租赁:电影。

1

思路

如果你非常关注两个对象之间的关系,那么你可能也想将这种关系建模为一个对象

对象是可见或有形且相对稳定的任何东西。

实现思路

您可以创建一个临时对象,该对象只在两个对象之间的关系存在期间存在。 如果需要,该对象可以充当中介或方法对象。

我感觉这可能是一种过度设计,并且可能不会立即被阅读代码的人所理解。


好的,这是我正在学习的课程的一项任务。我也有过度工程的感觉...我可能会尝试使用中介者来建模关系。 - Christophe De Troyer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接