Какими могут быть последствия не
делать это?
Вся идея инкапсуляции заключается в том, что все знания о чем-либо, связанном с классом (кроме его интерфейса), находятся внутри самого класса. Например, разрешение прямого доступа к атрибутам возлагает ответственность за то, чтобы убедиться, что любые назначения действительны для кода, выполняющего назначение. Если определение того, что является действительным, изменится, вы должны пройти и проверить все, используя класс, чтобы убедиться, что они соответствуют. Инкапсуляция правила в методе «setter» означает, что вам нужно изменить его только в одном месте, и любой вызывающий пользователь, пытающийся сделать что-то смешное, может получить исключение в ответ. Есть много других вещей, которые вы можете захотеть сделать при изменении атрибута, и сеттер - это место для этого.
Является ли хорошей практикой спорный вопрос о том, допустим ли прямой доступ к атрибутам, у которых нет правил для их связывания (например, все, что вписывается в целое число). Я предполагаю, что использование геттеров и сеттеров - хорошая идея для согласованности, т. Е. Вы всегда знаете, что вы можете вызвать setFoo()
, чтобы изменить атрибут foo
без необходимости искать, можете ли вы сделать это напрямую. Они также позволяют вам подготовить класс к будущему, так что если у вас есть дополнительный код для выполнения, место для его размещения уже есть.
Лично я думаю, что использование геттеров и сеттеров выглядит неуклюже. Я бы скорее написал x.foo = 34
, чем x.setFoo(34)
, и с нетерпением жду того дня, когда какой-нибудь язык предложит эквивалент триггеров базы данных для членов, которые позволят вам определить код, который запускается до, после или вместо назначений.