Как создать идеальное приложение ООП
недавно я пытался для компании "Х". Они прислали мне несколько вопросов и сказали, чтобы я решил только один.
проблема вот в чем -
основной налог с продаж применяется по ставке 10% на все товары, за исключением книг, продуктов питания и медицинских изделий, которые освобождены.
Импортная пошлина представляет собой дополнительный налог с продаж, применяемый ко всем импортируемым товарам по ставке 5%, без каких-либо исключений.
когда я покупаю товары, я получаю квитанцию, в которой указано имя всех предметов и их цены (включая налог), заканчивая общей стоимостью предметов и общей суммой уплаченных налогов с продаж.
Правила округления для налога с продаж заключаются в том, что для налоговой ставки n% цена полки p содержит (NP/100, округленное до ближайшего 0,05) сумму налога с продаж.
10 ответов:
во-первых святые небеса не делают финансовых расчетов в двойном. Финансовые расчеты в decimal; вот для чего он нужен. Использовать двойник для того чтобы разрешить физика проблемы, а не финансовые проблемы.
основным недостатком дизайна в вашей программе является то, что политика находится в неправильном месте. Кто отвечает за расчет налогов? Вы поставили продукт отвечает за вычисление налогов, но когда вы покупаете яблоко или книгу или стиральную машину,что вы собираетесь купить!--6--> не несет ответственности за говорю вам, сколько налогов вы будете платить. государственная политика отвечает за то, чтобы сказать вам это. Ваш дизайн массово нарушает основной принцип проектирования OO, который объекты должны нести ответственность за свои собственные проблемы, а не кто другой. Концерн стиральная машина стирать одежду, не заряжается правильный импорт обязанность. Если налоговое законодательство изменится, вы не хотите его менять объект стиральной машины, вы хотите изменить политика объекта.
Итак, как подходить к такого рода проблемам в будущем?
Я бы начал с выделения каждого важного существительного в описании проблемы:
основной налог с продаж применяется при a скорость 10% на все товары, за исключением - книги,еда и медицинских товаров это исключение. ввозной пошлины дополнительная налог с продаж применимо для всех импортных товаров на скорость 5%, без льготы. Когда я покупаю items Я получил поступление перечислены имя всех items и цена (включая налог), заканчиваю с общая стоимость из пунктов, и общее количество налоги заплатил. Правила округления для налог с продаж в том, что налоговая ставка в размере н%, а цена полка of p содержит (NP / 100 округлено до ближайшего 0,05) количество налог с продаж.
теперь, каковы отношения между всеми этими существительными?
- основной налог с продаж-это своего рода налог с продаж
- импорт Пошлина-это своего рода налог с продаж
- налог с продаж имеет ставку, которая является десятичной
- книги-это своего рода предмет
- еда-это своего рода предмет
- медицинские изделия являются своего рода элемент
- товары могут быть импортированы
- элемент имеет имя, которое является строкой
- товар имеет цену на полке, которая является десятичной. (Примечание: действительно ли товар имеет цену? две одинаковые стиральные машины могут быть проданы для разных цены в разных магазинах, или в одном магазине в разное время. Лучше было бы сказать, что ценовая политика связывает товар с его ценой.)
- политика освобождения от налога описывает условия, при которых налог с продаж неприменим к номенклатуре.
- чек содержит список товаров, их цены и налоги.
- в квитанции есть всего
- квитанция имеет общий налог
... и так далее. Как только вы все отношения между всеми существительными отработаны, после чего можно приступать к проектированию иерархии классов. Существует абстрактный элемент базового класса. Книга наследует от него. Существует абстрактный класс SalesTax; BasicSalesTax наследует от него. И так далее.
Если компания говорит что-то о библиотеках, таких как NUnit, JUnit или Test::Unit, более чем вероятно, что TDD действительно импортируется в них. В вашем примере кода вообще нет тестов.
Я бы попытался продемонстрировать практические знания:
- модульные тесты (например. Нанит)
- насмешливый (например. RhinoMocks)
- настойчивость (например. NHibernate)
- IoC-контейнеров (например. NSpring)
- шаблоны проектирования
- сплошной принцип
Я хотел бы рекомендовать www.dimecasts.net как впечатляющий источник бесплатных, хорошего качества скринкастов, который охватывает все вышеупомянутые темы.
это очень субъективно, но вот несколько моментов, которые я хотел бы сделать о вашем коде:
по-моему ты перепутал
ProductиShoppingCartItem.Productдолжны иметь наименование товара, налоговый статус и т. д. но не количество. Количество не является свойством продукта - оно будет отличаться для каждого клиента компании, который покупает этот конкретный продукт.
ShoppingCartItemдолжен бытьProductи количества. Таким образом, клиент может свободно купить более или менее одного и того же продукта. С вашей текущей настройкой это невозможно.расчет окончательного налога также не должен быть частью
Product- Это должно быть частью чего-то вродеShoppingCartс окончательным расчетом налога может включать в себя знание всех продуктов в корзине.
во-первых, это очень хороший вопрос. Это хороший показатель много навыки.
есть много вещей, которые вы должны понимать, чтобы обеспечить хороший ответ (есть нет идеальный ответ), как высокого, так и низкого уровня. Вот парочка:
- Моделирование -> как создать хорошую модель решения? Какие объекты вы создаете? Как они будут решать требования? Ищу существительные это хорошее начало, но как вы решите, если ваш выбор объектов хорош? Что другое объекты вам нужен? Что знаний вам нужно решить эту проблему?
- разъединение забот, свободное соединение, высокое сцепление -> как вы выделяете части конструкции, которые имеют различные проблемы или скорости изменения и как вы их связываете? Как вы держите ваш дизайн гибким и актуальным?
- модульное тестирование, рефакторинг, TDD с -> что у тебя
кроме того, что вы используете класс под названием product, вы не продемонстрировали, что знаете, что такое наследование, вы не создали несколько классов, наследующих от продукта, без полиморфизма. Проблема могла быть решена с использованием нескольких концепций ООП (даже просто чтобы показать, что вы их знаете). Это проблема интервью, поэтому вы хотите показать, как много вы знаете.
Я бы, однако, не превратился в депрессию прямо сейчас. Тот факт, что вы не показать их здесь это не значит, что вы их еще не знаете или не можете выучить.
вам просто нужно немного больше опыта работы с ООП или интервью.
удачи!
люди, которые начали изучать программирование с помощью ООП, не имеют больших проблем, чтобы понять, что это значит, потому что это как и в реальной жизни. Если у вас есть навыки с другими программными семьями, чем OO, это может быть сложнее понять.
прежде всего, выключите экран или выйдите из своей любимой среды IDE. Возьмите статьи и карандаш и составьте список объекты,отношения, человек,машины,процессы,материал и т. д. все это может быть встречено в вашей окончательной программе.
во-вторых, попробуйте получить разные basic объекты. Вы поймете, что некоторые могут поделиться свойства или способности, вы должны положить его в абстрактные объекты. Вы должны начать рисовать красивую схему вашего программа.
Далее вы должны поставить fonctionnalities (методы, функции, подпрограммы, называйте это как хотите): например, a продукт
идеальная реализация ООП полностью спорна. Из того, что я вижу в вашем вопросе, вы можете модулировать код на основе роли, которую они выполняют для вычисления конечной цены, такой как продукт, налог, ProductDB и т. д.
Productможет быть абстрактным классом и производными типами, такими как книги, Еда может быть унаследована от него. Применимость налога может быть определена производными типами. Продукт скажет, применим ли налог или нет на основе полученных класс.
TaxCriteriaможет быть перечислением, и это может быть указано во время покупки (импортировано, применимость налога с продаж).
Taxкласс будет вычислять налог на основеTaxCriteria.имеющего
ShoppingCartItemкак было предложено XXBBCC может инкапсулировать продукт и налоговые инстанции, и это отличный способ разделить детали продукта с количеством, общей ценой с налогом и т. д.хорошее удача.
с точки зрения строго OOA / D, одна из основных проблем, которую я вижу, заключается в том, что большинство атрибутов вашего класса имеют избыточное имя класса в имени атрибута. например,продукт цена, typeOf продукт. В этом случае везде, где вы используете этот класс, у вас будет слишком многословный и несколько запутанный код, например product.значение ProductName. Удалите избыточный префикс/суффиксы имени класса из ваших атрибутов.
кроме того, я не видел никаких классов, связанных с покупка и создание квитанции, как было задано в вопросе.
вот отличный пример шаблона OO для продуктов, налогов и т. д... Обратите внимание на использование интерфейсов, что очень важно в дизайне OO.
http://www.dreamincode.net/forums/topic/185426-design-patterns-strategy/
очень хорошей отправной точкой о правилах проектирования являются SOLID принципы.
например, принцип Open Closed гласит, что если вы хотите добавить новую функциональность, вам не нужно добавлять код в существующий класс, а скорее добавлять новый класс.
для вашего примера приложения это будет означать, что добавление нового налога с продаж потребует добавления нового класса. То же самое касается различных продуктов, которые являются исключениями из правила.
правила округления очевидно, идет в отдельный класс-принцип единой ответственности гласит, что каждый класс имеет одну ответственность.
Я думаю, что попытка написать код самостоятельно принесет гораздо больше пользы, чем просто написать хорошее решение и вставить его здесь.
простой алгоритм для написания идеальной разработанной программы будет:
- написать код, который решает проблему
- проверьте, соответствует ли код твердому телу принципы
- если есть нарушения правил, чем Гото 1.
Comments