Можно ли без каких-либо отрицательных последстий отказаться от открытых геттеров и сеттеров, если те только лишь возвращают/устанавливают значения?
Чёткое определение границ вопроса
Хотя я постарался чётко передать это в заголовке, ещё раз повторюсь, что данный вопрос сфокусирован на следующем сочетании условий:
- Геттеры лишь только возвращают значение соответствующего поля и ничего больше
- Сеттеры лишь только устанавливают новое значение соответствующего поля и ничего больше
- И геттеры, и сеттеры являются публичными
Таким образом ответы типа "сеттеры могут не только устанавливать значение, но и делать ещё что-то" или "сеттер можно сделать закрытым, тем самым сделав конкретное поле доступным только для чтения" не отвечают на заданный вопрос.
Логическое обоснование ненужности геттеров и сеттеров для рассматриваемого случая
При обучении языкам, поддерживающих ООП, обычно говорят что-то вроде:
Хорошим тоном является скрывать поля модификаторами
privateилиprotectedи получать к ним доступ извне через публичные геттеры и сеттеры.
Насчёт того, что не следует открывать поля, которые не нужны пользователю класса, возражений нет - всё рационально. Но данный вопрос именно о тех полях, к которым нужен доступ извне. И утверждение о том, что их тоже надо делать закрытыми и добавлять к ним публичные геттеры и сеттеры, звучит как догма, бэкграунд которой неясен.
Например, такой Java-класс:
class Person {
private String name;
private String email;
public String getName() {
return this.name;
}
public void setName(String newName) {
this.name= newName;
}
public String getEmail() {
return this.email;
}
public void setEmail(String newEmail) {
this.email = newEmail;
}
}
отличается от класса
class Person {
public String name;
public String email;
}
лишь только усложнённым способом доступа к полям name и email, но в результате пользователь всё равно может считывать и изменять это поля, потому непонятно, на каком основании часто говорят, что "с геттерами и сеттерами безопаснее".
В C#-таки вообще, существует традиция все поля обкладывать геттерами и сеттерами:
public class Person
{
public string Name { get; set; };
public string Email { get; set; };
}
И опять: это что-то реально даёт по сравнению с ниже приведённым кодом, или просто какой-то абстрактный Best practice типа "все так делают, и ты так делай"?
public class Person
{
public string Name;
public string Email;
}
Ответы (1 шт):
Отвечая коротко на ваш вопрос: можно.
Но есть одно маленькое «но». Если такой ваш код будет использоваться в другой сборке, то вы потеряете бинарную совместимость.
Возможно, в будущей версии вашей программы вам всё-таки захочется воспользоваться одним из преимуществ свойств над полями (например, добавить проверку значения, навесить вызов события и т.д.) и вы обернете ваше поле в свойство, пусть даже с тем же именем. В этом случае все сборки, использующие ваш код (вашу сборку), хоть и останутся синтаксически корректными, но перестанут работать до перекомпиляции. Как ваши, так и сторонние, разработчики которых решили воспользоваться вашей сборкой.
Если же в ваших или сторонних сборках использовалась рефлексия в отношении вашего кода, то потребуется не только перекомпиляция, но и, вероятно, исправление кода.