У меня есть класс с одной частной области:избежать сеттер, чтобы изменить значение свойства класса
class Person {
string name;
public void setName(string name);
}
Затем, используя какой-то объект, который отвечает за взаимодействие с пользователем (в данном примере с помощью командной строки), я хочу для изменения значения этого поля:
Person somePerson;
CommandLineView view;
somePerson.setName(view.askUserForName());
Это работает. Но мне не нравится использовать функцию set
, поскольку она предоставляет членам класса. Поэтому я начал смотреть, как этого избежать.
Новая реализация выглядит следующим образом:
class Person
{
string name;
public void changeName(view) { name = view.askUserForName(); }
}
и:
Person somePerson;
CommandLineView view;
somePerson.changeName(view);
Теперь Person
не разоблачить своего члена. Кроме того, этот класс отвечает за логику, связанную с изменением имени (например, функция changeName
также может обновлять базу данных, уведомлять заинтересованные стороны и т. Д.
Вопрос: Является ли такой рефакторинг хорошей практикой? Или, может быть, реализация с setter
была лучше ?, даже если она нарушает инкапсуляцию
не знаю, подходит ли этот вопрос здесь, но IMO так, как вы его используете, теперь пара 'Person' подходит к' CommandLineView' - лучше иметь установщик или просто метод changeName (принимая новое имя) - это нормально, чтобы представление зависело от модели (очевидно), но другое направление - большой знак * предупреждения *! – Carsten
Почему вы не хотите выставлять имя? –
@Carsten - так что вы думаете о вставке нового слоя между 'person' и' view', например, некоторым презентатором? –