Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
86 / 13 / 1
Регистрация: 24.05.2010
Сообщений: 590
.NET 4.x

Оцените задание: модуль расчета скидок

04.06.2018, 11:23. Показов 1927. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет!

Задание:


Решение: DiscountModule.zip

Буду благодарен за комментарии.

0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
04.06.2018, 11:23
Ответы с готовыми решениями:

Оцените задание: программу анализа текста
Привет! Занимаюсь давно программированием, но не C#. C# иногда использую в работе, но это не основной язык. Хочу сменить сферу...

Оцените программу расчета стоимости парковки
У Дейтлов есть задача: Я написал такой код: #include<iostream> using namespace std; #include<windows> ...

Модуль расчета по формуле!
Ребята мне нужно создать модуль который будет расчитывать мощность! у нас есть файл из которого мы считываем скорость и время! А модуль...

6
86 / 13 / 1
Регистрация: 24.05.2010
Сообщений: 590
12.06.2018, 11:06  [ТС]
Актуально.
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10425 / 5155 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
12.06.2018, 13:56
Лучший ответ Сообщение было отмечено V0fka как решение

Решение

V0fka,

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

Технические моменты:
1) Для денег используется не double а decimal.
2) Абстрактный класс DiscountBase содержит кусок бизнес-логики, который впоследствии может меняться. А это нехорошо. Тем более в задании явно сказано что не должно быть rework при изменении условий скидок. А у вас как раз этот rework будет, причем прямо в абстрактном классе.
3) У вас в коде полно волшебных констант, которых быть не должно. Всякие 50, 0.2 и т.д. - это на самом деле должны быть параметры (члены) класса, а не inline константами. Если завтра вам потребуется сделать скидку не 50 долларов, а 49 - неужели вы будете писать новый класс?
4) Неявное присвоение LowDiscount в конструкторе User по умолчанию - выглядит не очень. Лучше это вообще убрать.
5)
C#
1
2
             if (user.Birthday.Day == DateTime.Now.Day && 
                user.Birthday.Month == DateTime.Now.Month)
Костыль. Фу-фу.
А кроме того, есть 29 февраля, и ним таки надо что-то делать.
6)
C#
1
2
3
            switch (discountStrategyStr.ToLower())
            {
                case "high":
Are you seriously? Yeah?
Сделайте хотя бы enum.
7) Вместо SetDiscountStrategy лучше
C#
1
public DiscountBase DiscountStrategy {protected get; public set;}
Архитектурные моменты:
Во-первых, вы вводите класс User, который является избыточной сущностью для вашей задачи. Вам всего лишь нужно посчитать скидки, а вы вводите аж целого юзера. Кроме того, у вас в задании написано, что вы разрабатываете модуль (!) для вебсайта. То есть внутри сайта уже наверняка есть сущность User со всем атрибутами. И ваш еще один User аж никак туда не вписывается.
Для вас лучшим решением был бы интерфейс IUserDisountInfo который бы давал вам информацию о юзере, необходимую для скидок (вам в общем-то нужно только segment и дата рождения). А основной класс User (из ядра системы) реализовал бы этот интерфейс.

Во-вторых, у вас центральным объектом должен быть не User а класс Order, которого у вас вообще нет. Почему у вас скидки живут внутри юзера? Скидка - это не атрибут юзера. Это атрибут заказа.
Т.о. нужно сделать класс Order типа такого:
C#
1
2
3
4
5
6
7
class Order
{
  IUserDisountInfo UserInfo;
  DateTime OrderDate;
  decimal Amount;
  decimal Discount {get;}
}
И работать с ним а не с User.

В-третьих, у вас принципиальная ошибка при расчете скидки в день рождения. У вас используется текущая дата (DateTime.Now) а должна использоваться дата заказа. В противном случае у вас скидка будет зависеть от того, в какой день ее посмотреть. Сегодня она будет одна, а завтра - уже другая! На один и тот же заказ!

Как бы сделал я:
На мой взгляд, классическое ООП не подходит для этой задачи. Вот эти скидки, их условия - очень часто меняются. В реальности менеджер каждый день может придумывать новую систему скидок. Вы что же, каждый раз будете писать классы под каждую скидку? (впрочем я конечно знаю, что такие программисты существуют в реальности, но это индуизм чистой воды).
Поэтому здесь лучше использовать подход который называется anemic model, суть которого заключается в том, что скидка это не внутреннее свойство класса Order а значение, вычисляемое с помощью внешних сервисов. Внешние сервисы должны обеспечивать легкую и быструю смену алгоритмов расчетов скидки, при этом сам Order будет оставаться прежним.
При этом набор самих сервисов - невелик. Вам нужно реализовать четыре сервиса:
1) Константная скидка ( например -$50)
2) Процентая скидка (например -20%)
3) Скидка на день рождения
4) Ограничитель, который не дает скидке быть более 90%
Все возможные скидки из вашего задания могут быть скомпонованы из этих базовых скидок.
Такой подход позволит формировать системы скидок динамически из интерфейса пользователя. И не придется создавать отдельный класс на каждый чих менеджера.

Вторая фишка, которую я бы реализовал - это method chaining. Это не дает каких-то принципиальных преимуществ, но зато запись скидок будет выглядеть компактнее и понятнее.
Смысл этого подхода в том, что метод принимает на вход Order, добавляет свое значение скидки и возвращает тот же объект Order. Это позволяет записывать скидку в таком виде:
C#
1
Order.AddConstDiscount(50).AddPercentDiscount(20).AddBirthdayDiscount(2).LimitDiscount(90);
Сами методы AddConstDiscount, AddPercentDiscount можно реализовать как методы класса-расширения для Order.
Что то типа такого:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public interface IUserDicountInfo
{
    DateTime? Birthday { get; }
}
 
public class Order
{
    public IUserDicountInfo UserInfo;
    public decimal Amount;
    public decimal Discount;
    public DateTime OrderDate;
}
 
 
public static class DiscountServices
{
    public static Order AddConstDiscount(this Order order, decimal constDiscount)
    {
        order.Discount += constDiscount;
        return order;
    }
 
    //other discounts ....
}
3
86 / 13 / 1
Регистрация: 24.05.2010
Сообщений: 590
12.06.2018, 16:12  [ТС]
Storm23, спасибо большое за очень развернутый ответ! На досуге детально проанализирую все, что вы написали.
0
86 / 13 / 1
Регистрация: 24.05.2010
Сообщений: 590
20.06.2018, 10:58  [ТС]
Цитата Сообщение от Storm23 Посмотреть сообщение
Костыль. Фу-фу.
А кроме того, есть 29 февраля, и ним таки надо что-то делать.
Не могу понять, почему там "попахивает" и какая проблема будет в случае с 29 февраля?

В остальном вопросов нету .
Ещё раз спасибо вам за детальный анализ и разъяснения!
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10425 / 5155 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
20.06.2018, 11:14
Цитата Сообщение от V0fka Посмотреть сообщение
какая проблема будет в случае с 29 февраля?
Если у человека ДР 29 февраля, то он незаслуженно не получит скидку в невысокосный год. Соответственно, 1 марта нужно давать скидку и тем кто родился 1 марта и тем кто родился 29 февраля (если год невысокосный). Поэтому алгоритм сравнения дат должен быть сложнее. Да и вообще с датами нужно очень аккуратно работать, там много подводных камней бывает.
1
86 / 13 / 1
Регистрация: 24.05.2010
Сообщений: 590
20.06.2018, 11:39  [ТС]
Ясно, спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
20.06.2018, 11:39
Помогаю со студенческими работами здесь

Задание в MatCAD для расчета
Здравствуйте! Есть программа написанная в DOS которая считает волноводы по заданным параметрам и в зависимости от результата выводит...

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

Модуль для расчета солнечной интерференции
Здравствуйте все! Доброго времени суток! http://www.rcsc.kz/index.php?option=com_content&view=article&id=330&Itemid=328&lang=ru...

Оцените пожалуйста тестовое задание
Доброго времени суток, уважаемые форумчане :) Работодатель прислал следующее задание: "Необходимо разработать одностраничное...

Модуль triangle, содержащий набор функций для выполнения расчета треугольников
Разработаем модуль triangle, содержащий набор функций для выполнения расчета треугольников, используя известные формулы из геометрии. При...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru