Ответы пользователя по тегу ООП
  • Что здесь полиморфизм?

    sarapinit
    @sarapinit Куратор тега C#
    Точу водой камень
    Запутаться в термине "полиморфизм" несложно. Потому что у термина много значений.
    В вашем примере я бы рассуждал так:
    полиморфизм = поли + морфос
    поли = много
    морфос = форма
    то есть полиморфизм значит "много форм"

    У нас есть класс А, у него есть свойство Name. Когда мы ставим ключевое слово virtual, мы говорим что для всех типов, которые есть А у свойства Name может быть много разных форм.
    Когда мы наследуем B от А и переопределяем свойство Name, мы задаем еще одну форму.
    У свойства Name в зависимости от типа будет определенная форма, одна из множества форм.
    Это и есть полиморфизм.
    Это и есть дзен)
    Ответ написан
    1 комментарий
  • Все ли поля класса нужно инкапсулировать?

    sarapinit
    @sarapinit
    Точу водой камень
    Зависит от того как будет использоваться класс.
    Однв из целей инкапсуляции снижение вероятности что класс/модуль/функция будет использована неверно. В предельном случае апи класса должно позволять только верное использование. Но так не всегда язык позволяет это сделать.
    Ответ написан
    Комментировать
  • В каких случаях использовать приватные поля при определении класса?

    sarapinit
    @sarapinit
    Точу водой камень
    если у вас typescript, вы можете так сделать

    class Rectangle {
      readonly x: number
      readonly y: number
      readonly w: number
      readonly h: number
        
      constructor(x: number, y: number, w: number, h: number) {
        this.x = x
        this.y = y
        this.w = w
        this.h = h
      }
    }
    
    class Canvas {
      private w: number
      private h: number
    
      constructor(w: number, h: number) {
        this.w = w;
        this.h = h;
      }	
    
      public drawRect(rect: Rectangle) {
        //draw implementation
      }
    }


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

    Рекомендую почитать про Rich model и Anaemic model, это даст некоторое понимание про разницу подходов и то какие плюсы\минусы есть.
    Ответ написан
    2 комментария
  • Что делается до декомпозиции ПО?

    sarapinit
    @sarapinit
    Точу водой камень
    Сбор и анализ требований, составление тех задания. Если проектирование ведется по DDD, то составление единого непротиворечивого языка предметной области: выявление сущностей, агрегатов, связанных контекстов, событий предметной области. Это в крупных проектах.

    В мелких на бумажке рисуешь какую-то минимальную схему и приступаешь. В реальном мире не всегда фаза проектирования присутствует.
    Ответ написан
  • Как использовать статическое свойство из дочернего класса?

    sarapinit
    @sarapinit Куратор тега C#
    Точу водой камень
    Я бы отказался от использования глобального состояния. Если вам действительно нужен один экземпляр, то создавайте его явно в корне приложения и переиспользуйте или доверьте эту обязанность IoC контейнеру.
    Реализация без глобальных переменных:

    public abstract class ActiveRecordEntity
        {
            protected int Id { get; set; }
    
            public readonly string TableName;
            public DataTable DataTable { get; }
    
            public ActiveRecordEntity(string tableName, SQLiteConnection connection)
            {
                TableName = tableName;
                DataTable = new DataTable { Locale = CultureInfo.InvariantCulture };
                var dataAdapter = new SQLiteDataAdapter
                {
                    SelectCommand = new SQLiteCommand($"SELECT * FROM {TableName}", connection)
                };
    
                dataAdapter.Fill(DataTable);
            }
        }
        public class Category : ActiveRecordEntity
        {
            public string Title { get; set; }
            public Category(SQLiteConnection connection) : base("category", connection)
            {
            }
        }
    Ответ написан
    Комментировать