2012-03-16 2 views
0

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

Пример:

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){...} 
} 

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

Правильно ли эта мысль?

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

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

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

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 
    } 
} 

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

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

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

+0

Вы могли бы предоставить более конкретный пример? Насколько я вижу, вы не нарушаете LSP. Обратите внимание, что вы можете иметь дело с Class3, но это не имеет ничего общего с «базой». Он по-прежнему является базовым объектом и другими его методами. Это просто зависит от того, нужен ли классу клиента объект «Base» или «Class2» – DPM

+0

, кажется, вы забыли ключевое слово extends. Кроме того, я до сих пор не уверен, что означает «Количественный и диапазон» и их связь со стоимостью и «преданностью». Вы также можете включить стоимость кода. – DPM

+0

Ваше разъяснение, похоже, не помогло, так как вы забыли много вещей, которые иллюстрируют вашу проблему. Ваши объекты не наследуют ни от чего другого, и вы не определили, что означает «presencial». –

ответ

0

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

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

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

1

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

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

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

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

+0

Я не пытаюсь переместить Realtionship класса 3 в базовый класс. Я знаю, что это плохо. Моя реальная проблема ниже в «уточненной» модели (Извините, что я лучше всего иллюстрирую это). Стоимость связана с RangeCourseClass, но мне нужно иметь дело с объектом CourseClass, в этом случае мне нужно будет использовать instanceof для RangeCourseClass. Это проблема. – Leo

0

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