ОО Дизайн Моделирование - PullRequest
       23

ОО Дизайн Моделирование

0 голосов
/ 16 марта 2012

Как моделировать домен, если у вас есть базовый класс и 2 класса, расширяющие этот базовый класс, и только один из производных классов имеет связь с другим объектом.

Пример:

public abstract class Base  
{  
    public abstract void method();  
}

public class1 extends Base  
{
    public void method()
    {
         do some stuff
    }
}

public class2 extends Base  
{
    private Class3 class3;       

    public void method()
    {
         do other stuff
    }

    public Class3 getClass3(){...}

    public void setClass3(Class3 class3){...}
}  

Эта модель нарушает принцип Лискова? Я так думаю из-за этого отношения с class3, поэтому мы должны выяснить, как моделировать без этого отношения или переместить это отношение в Base. Если у меня есть часть программы, которая работает с Class2 для обработки отношения с Class3, я не могу работать с базовым классом без приведения к class2.

Это правильная мысль?

Разъяснение ...

Давайте подумаем в модели обучения. У нас есть курсы и курсы. У нас также могут быть онлайн-курсы и специальные курсы. В учебных курсах мы можем столкнуться со стоимостью этого обучения. Таким образом, затраты имеют смысл только для презентационной среды. У CourseClasses могут быть даты диапазона или количественные даты.

Сегодня у меня есть эта модель:

Course
{
    ...
}

public abstract class CourseClass
{
    private Course course; 

    // getter and setter to course

    public abstract Enrollment enroll(Person student);
}

public class QuantitativeCourseClass
{
    public Enrollment enroll(Person student)
    {
        // enroll for quantitative
    }
}

public class RangeCourseClass
{
    public Enrollment enroll(Person student)
    {
        // enroll for range
    }
}

Теперь мне приходится иметь дело с расходами, и до этого момента курс обучения для меня не важен, но сейчас стоимость имеет смысл только для презентации.

Моя проблема заключается в следующем: мне нужно иметь дело с объектом CourseClass в модуле затрат, потому что мне нужны некоторые вещи, конечно, CourseClass, но соотношение затрат с RangeCourseClass, потому что QuantitativeCourseClass не имеет смысла для предварительной среды.

Вопрос о Лискове о том, как заставить мою команду внести некоторые изменения в эту модель.

Ответы [ 3 ]

1 голос
/ 16 марта 2012

если class3 не имеет никакого отношения к базе, то он не должен быть в базе.Вы не можете «сломать» LSP, так как компилятор его применяет.Унижение рейтинга - это не то, что является предпочтительным, но это не нарушает LSP.

Цель наследования состоит в том, чтобы иметь отношения «есть».Кошка - (n) животное.Тойота - это машина.

То, о чем вы говорите, это перемещение эмблемы Toyota в автомобильный класс только потому, что вы хотите упростить ситуацию.Это совсем не хороший дизайн.

Короче говоря, дизайн хуже переносить вещи в базовый класс, чем опускать в конкретный класс.

0 голосов
/ 10 мая 2012

Как я понимаю, вы не можете просмотреть проблему, не зная проблемных аспектов (например, геометрию).Итак, я не могу понять смысл вашей архитектуры.Например, знаменитое нарушение LSP. Пример: Square: Rectangle - выглядит хорошо, когда стоит в «стороне».Но когда вы начинаете использовать и добавляете некоторые функции, вы видите проблему.

0 голосов
/ 16 марта 2012

Я думаю, что вы перепутали направление LSP (принцип замещения Лискова): LSP - это (сильный) поведенческий подтип, а не сильный поведенческий супертип.Таким образом, LSP не работает против вашего примера, но для вашего примера:

Эта модель нарушает принцип Лискова?Я так думаю из-за этого отношения с class3, поэтому мы должны выяснить, как моделировать без этого отношения или переместить это отношение в Base.Если у меня есть часть программы, которая работает с Class2 для обработки отношений с Class3, я не могу работать с базовым классом без приведения к классу 2.

Ваша модель не нарушает LSP.Если у вас есть часть программы, которая использует некоторую переменную var, которая имеет непосредственное отношение к Class2 (то есть части, отсутствующие в Base), вам нужно объявить var как Class2 .Так что не надо опускать руки.А LSP также гарантирует, что var ведет себя как Base, так что явного обновления также не требуется.

...