Класс C # - слишком общий, вызывающий ненужные накладные расходы? - PullRequest
0 голосов
/ 08 марта 2019

построение с использованием Webforms

У меня есть несколько классов, которые содержат все виды свойств:

Позволяет сказать:

USER:
Forename,
Surname,
EyeColour,
FavouriteIceCream

В разных частях моего сайта ямне нужно отобразить список пользователей таким образом:

Bob Jones,
Fred Smith,
Susan Gifford

, тогда как в других частях мне нужен список:

GIFFORD, Susan
JONES, Bob
SMITH, Fred

Как и мне может понадобиться сократить их имена до

BJo
FSm
SGi

В моей голове кажется разумным иметь дополнительные свойства внутри моего класса под названием:

Fullname (forename + ' ' + surname)
Reverse (ToUpper(surname) +', ' + forename)
Intials

, которые заполняются во время создания объекта USER и позже, когда я хочу отобразить Боба, я могузвоните ThisUser.FullName вместо

ThisUser.Forename + " " + ThisUser.Surname

Разве это плохая практика - создавать дополнительные свойства во время создания, если я не собираюсь использовать их часто?

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

Мне кажется, это хороший способбыть последовательным, любая страницаиспользование обратного формата имени всегда будет JONES, Bob, а не иногда Jones, Bob, если страница написана одной из команд, которые забыли требуемый формат. Другая сторона аргумента, я думаю, будетимеет минимальный пользовательский класс, и мы добавляем дополнительные поля только тогда, когда нам нужно знать их молочные предпочтения

// дополнительные, если это имеет значение, внутренняя веб-форма на основе интрасети, поэтому только 200 пользователей

Ответы [ 4 ]

1 голос
/ 08 марта 2019

Плохо ли создавать дополнительные свойства во время создания, если я не собираюсь использовать их часто?

Да. Используйте рассчитанные только для чтения свойства:

public String Fullname {
  get {
    return Forename + " " + LastName;
  }
}
1 голос
/ 08 марта 2019

Я думаю, что хранить значения этих свойств во время создания экземпляра - плохая идея. Но вы все еще можете использовать свойства get, как это:

string Forename;
string Surname;

// set value for the private properties as usual
public User(string fn, string sn)
{
    Forename = fn;
    Surname = sn;
}

// getters
public string DefaultName
{
    get { return Forname + “ “ + Surname; }
}

public string ReversedName
{
    get { return Surname + “ “ + Forename; }
}

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

0 голосов
/ 08 марта 2019

Как обычно: это зависит.

Заполнение набора свойств класса для хранения различных версий одной и той же информации - ИМХО не лучшая идея.

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

Используясвойство самого класса у вас есть как минимум четыре возможности:

  • Заполнить при создании объекта (если он неизменный)

    public class Person
    {
        public Person(string firstName, string lastName)
        {
            FirstName = firstName;
            LastName = lastName;
            FullName = $"{FirstName} {LastName}";
        }
    
        public string FirstName { get; }
        public string LastName { get; }
        public string FullName { get; }
    }
    
  • Заполните его, когда вызывается зависимый установщик (если он изменчив)

    public class Person
    {
        private string _firstName;
        private string _lastName;
    
        public string FirstName
        {
            get => _firstName;
            set
            {
                _firstName = value;
                UpdateFullName();
            }
        }
        public string LastName
        {
            get => _lastName;
            set
            {
                _lastName = value;
                UpdateFullName();
            }
        }
        public string FullName { get; private set; }
    
        private void UpdateFullName()
        {
            FullName = $"{FirstName} {LastName}";
        }
    }
    
  • Создайте значение на лету, когда оно будет вызываться (несколько раз, если вызывается несколько раз)

    public class Person
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string FullName => $"{FirstName} {LastName}";
    }
    
  • Создайте значение один раз при его вызове и возвращайте этот результат, пока не будет изменено зависимое значение.

    public class Person
    {
        private string _firstName;
        private string _lastName;
        private Lazy<string> _fullName;
    
        public string FirstName
        {
            get => _firstName;
            set
            {
                _firstName = value;
                UpdateFullName();
            }
        }
        public string LastName
        {
            get => _lastName;
            set
            {
                _lastName = value;
                UpdateFullName();
            }
        }
        public string FullName => _fullName.Value;
    
        private void UpdateFullName()
        {
            _fullName = new Lazy<string>(()=> $"{FirstName} {LastName}");
        }
    }
    

Особенно использование Of Lazy<> может помочь в случае сложного создания, которое используется только в определенных местах.Он вычислит значение один раз при первом вызове, а затем вернет вычисленный результат при всех последовательных вызовах.Если значение необходимо переоценить (при следующем вызове), вы просто создаете новую версию экземпляра Lazy<>.

Если вы объедините подход Lazy<> с неизменяемостью, вы также можете получитьчто-то вроде этого (что будет моим выбором, если позволяют ограничения):

public class Person
{
    private Lazy<string> _fullname;

    public Person(string firstName, string lastName)
    {
        FirstName = firstName;
        LastName = lastName;
        _fullname = new Lazy<string>($"{FirstName} {LastName}");
    }

    public string FirstName { get; }
    public string LastName { get; }
    public string FullName => _fullname.Value;
}
0 голосов
/ 08 марта 2019

, которые заполняются во время создания объекта USER [...], поле подтверждается каждый раз, когда я ссылаюсь на пользователя ...

Вы говорите о создании статических свойств, которые вы бы заполнили? Почему бы просто не создать динамические свойства? Как то так:

public string Fullname { get { return $"{Forename} {Surname}"; } }
public string Reverse { get { return $"{Surname.ToUpper()}, {Forename}"; } }
// etc.

Нет необходимости заполнять одни и те же данные дважды, и они не будут использоваться, пока вы не вызовете их.

По сути, это не выбор между дублированием данных и размещением логики во всем приложении, это выбор между размещением логики во всем приложении или размещением его на объекте. Просто поместите логику на объект.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...