2012-03-30 2 views
0

Извините, если это дубликат.Как смоделировать эту структуру?

Что я хочу моделировать, это корзина для покупок, которая добавляет к ней элементы (и, предположительно, позже создает заказ). Существует два основных типа элементов. Типы запасов, которые имеют акции, и общие типы, которые не имеют запаса. Фондовые позиции могут быть добавлены только в случае наличия достаточного запаса, иначе он не будет добавлен. Будет базовый класс, который имеет общие свойства между обоими типами элементов.

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

Сотрудник предложил другой подход, который не требовал бы проверки типа предмета; вместо этого метод базового класса будет иметь метод hasEnoughStock(). У фондовых позиций был бы метод, переопределенный для проведения реальных проверок акций, а не фондовые позиции просто вернут некоторое истинное значение (т. Е. Они всегда будут иметь достаточный запас). Я думаю, что мой коллега имеет лучший подход; однако для меня это немного забавно, имея функцию проверки запасов на предмет, который на самом деле не имеет реального запаса.

Что я хотел бы задать, это правильный подход с точки зрения OO (или, возможно, существуют разные подходы).

Мы планируем сделать это на C#, если это имеет значение.

Заранее спасибо

+0

Спасибо вам обоим ... только одна из тех вещей, где имя меня сбило с неправильной дорожки. – Marcin

ответ

1

Я также думаю, что подход с общей функцией в базовом классе правильный. Если у вас есть сомнения по поводу имени hasEnoughStock(), что о функции под названием canAddToCart()? `

НЕРАСПРОСТРАНЕНИЕ класс склад товар будет просто вернуть истинный или сделать некоторые другие проверки, класс склада товар будет вызывать закрытую функцию под названием hasEnoughStock(), как это :

public class NonStockItem : Item { 
    public override bool canAddToCart() { 
     return true; 
    } 
} 


public class StockItem : Item { 
    public override bool canAddToCart() { 
     return haveEnoughStock(); 
    } 

    private bool haveEnoughStock() { 
     return ... doStockCheckHere; 
    } 
} 
0

подхода вашего коллеги, кажется разумным - если это поможет, вы можете думать о неакционерном пункте (скажем, электронной книга, например) в качестве виртуального запаса. Это просто семантика, но вы можете назвать свою собственность/метод тем, что вам нравится, не обязательно иметь «hasEnoughStock» - это может быть «IsAvaialble» или «ValidItem». что кажется вам наиболее логичным.

1

Вот мой пример.

Допустим, у вас есть класс WashingMachine. Обязанность объекта WashingMachine состоит в том, чтобы мыть одежду. Это не обязанность WashingMachine рассчитать налог, проверить, нет ли в наличии или на складе.

Расчет налога является обязанностью выставления счетов и проверяет, не является ли оно на складе обязательством чего-то еще.

Точно так же, я думаю, что это не обязанность Предмета, чтобы решить, что это вещь или вещь. Он должен быть делегирован someother, в этом случае это может быть класс Warehouse или что-то, кто определяет тип, и решает добавить его или нет.

Class Item 
{ 

} 

//Lack of creativity, I just named it as Manager. You can come up with more appropriate name, 
Class Manager 
{ 
    //Determine weather the item is with stock or without stock. 


} 

Class Shoppingcart 
{ 
    //Instantiate Manager. 
    //Invoke the method which determines stock or out of stock. 

} 

Надеюсь, это поможет.

+0

Интересно.Можете ли вы каким-то образом объяснить, как это будет работать с точки зрения кода, потому что я не могу это увидеть. – Marcin

Смежные вопросы