• Как изменять значение зависимости от внешних факторов?

    @GineTik Автор вопроса
    Что ж, решил ответить на свой вопрос, написать как я сейчас думаю можно решить это задание.

    Если решать эту задачу с учетом того, что больше никак и никем улучшаться этот функционал (несколько условий) не будет, то как и указал mayton2019 можно написать простенький метод по типу:
    // не знаю на счет работоспособности кода, не проверял
    // константы можно куда-то вынести
    
    private const decimal PRICE_FOR_BAGGAGE = 50D;
    
    private const int LIMIT_DAYS_FOR_UP_PRICE = 5;
    private const decimal PRICE_PER_OVERDUE_DAY = 10D;
    
    public decimal CalculateActualPrice(Flight flight) 
    {
        var actualPrice = flight.BasePrice;
        
        if (flight.HasBaggage == true)
            actualPrice += PRICE_FOR_BAGGAGE;
    
         int daysLeft = (flight.DateOfDeparture - DateTime.UtcNow).TotalDays;
         if (daysLeft <= LIMIT_DAYS_FOR_UP_PRICE && daysLeft > 0)
            actualPrice += daysLeft * PRICE_PER_OVERDUE_DAY;
    
        // ...
    
        return actualPrice;
    }


    Но, если нужно будет добавлять много функционала тогда можно было бы создать класс PriceBuilder и использовать его, например:
    decimal actualPrice = new PriceBuilder(flight)
        .CorrectionForBaggage(priceForBaggageAvailability: 50D)
        .CorrectionForDaysLeft(limitDaysForUpPrice: 5,  pricePerOverdueDay: 10D)
        // ...
        .Build();


    Кстати, я не против если вы предложите свои варианты или покритикуете мои.)
    Ответ написан
    Комментировать
  • Как правильно структурировать программу?

    @GineTik
    В дополнение ко всем ответам могу порекомендовать посмотреть и изучить несколько архитектурных подходов(например, вот). Также можете посмотреть на паттерны.

    Может есть какие-то правила, которым нужно следовать при создании модулей/классов и т.д.? Или рекомендации?

    Есть стиль написания кода, для разных языков свои стили. Для c# это описано тут, для python - тут, можете погуглить code style и для других языков. Для того, что бы создавать хорошие классы, посмотрите на принципы SOLID, DRY, KISS.

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

    Если вся программа(или большая ее часть) будет в одном файле, тогда при изменении кода вы получите список багов которые будет трудно найти. Также в такой программе будет сложнее разобраться другому разработчику(и вообще сложно будет разрабатывать такую программу командой)!

    Плюс побольше практики, без нее никуда!

    Можете меня поправить если что не так)
    Ответ написан
    Комментировать
  • Как организовать логику на основе типа сущности?

    @GineTik
    Не могу сказать что мой ответ будет истинным, но может он чем-то поможет!

    При вызове этой ручки передаётся тип животного и в контроллере идет проверка если тип такой то+ личные свойства животного подходят под проверку делаем такие то действия, для пример
    если тип = cat то создаем класс new Cat(params)
    или если тип monkey && weight > 20, new Monkey

    Думаю, такой подход не очень хороший, так как при увеличении тех же животных придется городить больше ифов (свитчей и т.д.) в одном методе. В последствии будет большой и неудобный метод!

    Как вы ответили в конце лучше будет сделать несколько конечных точек
    POST /api/animals/cat {name: '..', anotherParam1}
    POST /api/animals/dog {name: '..', anotherParam2}
    POST /api/animals/owl {name: '..', anotherParam4: ''}
    и в каждом уже прописать нужную логику. Будет лучше читаться и легче изменяться.

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

    Для проверки полей или валидации рекомендую создать отдельные классы по типу CatValidator, MonkeyValidator которые будут наследоваться от, например, IValidator с методом Validate.

    При это в одной главной таблице создается запись что животное принято, animals -> id, date, type
    и затем для каждого животного свой класс и запись в свою таблицу new Cat(requestParams), new Dog(requestParams), etc
    Не понятно зачем вам главная таблица Animals с перечнем всех животных, можете уточнить?

    Для каждого создать свою request модель с валидацией, не придется в методе определять тип, сразу будет new Cat(params)...

    Как мне кажется такой вариант будет неплохой. Также валидацию можно будет сделать c помощью атрибутов и встроенной в asp.net валидацией(ModelState.IsValid)
    Ответ написан
  • Entity Framework Core не генерирует нужные таблицы, как решить?

    @GineTik Автор вопроса
    Я просто в ScheduleContext прописал DbSet-ы как поля, а не свойства.
    То есть я заменил
    public DbSet<Schedule> Schedules;
    public DbSet<Day> Days;
    public DbSet<Lesson> Lessons;
    public DbSet<Comment> Comments;
    public DbSet<HistoryUserItem> HistoryUser;
    public DbSet<HistoryScheduleItem> HistorySchedule;
    public DbSet<TypeOfAction> TypeOfActions;
    на
    public DbSet<Schedule> Schedules { get; set; }
    public DbSet<Day> Days { get; set; }
    public DbSet<Lesson> Lessons { get; set; }
    public DbSet<Comment> Comments { get; set; }
    public DbSet<HistoryUserItem> HistoryUser { get; set; }
    public DbSet<HistoryScheduleItem> HistorySchedule { get; set; }
    public DbSet<TypeOfAction> TypeOfActions { get; set; }

    В этом и была проблема :)
    Ответ написан
    Комментировать
  • Не работает команда ssh-add (Could not open a connection to your authentication agent), как пофиксить?

    @GineTik Автор вопроса
    оказывается Аваст поместил файл ssh-agent.exe в карантиную зону а я и не заметил
    теперь все работает!
    Ответ написан
    Комментировать
  • Как изменить кол-во столбцов в ListView в WinForms?

    @GineTik
    602793cd1673e808729799.png
    В правом верхнем углу есть такая стрелочка как на картинке нажмите на нее, а потом измените параметр "Представление" на List, но это не полностью решит проблему, просто если надо.

    Сам сейчас сижу ищу ответ)

    Вот нашел, можно использовать ListBox!!! Это точно то что вам нужно :)
    Ответ написан
    Комментировать
  • Не создается файл с помощью fstream c++, не понятно, почему?

    @GineTik Автор вопроса
    все нашел решение!!!

    надо было написать
    file.open(way, fstream::in | fstream::out | fstream::app);

    не знаю почему так, но надо)
    Ответ написан