История изменений
Исправление
vertexua,
(текущая версия)
:
Но, извините, даже сеттеры и геттеры наверное в 90% случаев реализованы как прокси-сервис к простой записи/чтению переменной без всяких проверок
Стиль программирования на таких языках изменился с годами достаточно сильно. Многие компании на уровне code style поощряют сильное отделение value class от других классов. Первые еще и иммутабельные обычно и создаются с фабриками, в которых стоят валидаторы. Не зависимо от языка, C++ подобный псевдокод выглядит так
class MyClass {
private:
MyClass(...)
public:
MyClass Create(...) {
Validate(IsLatin(name))
Validate(0<=age<=150)
Validate(MatchPhoneNumber(phone_number))
}
// NO SETTERS!
}
Класс нельзя мутировать, нельзя создать через какой-то бекдор невалидным. Потому после создания он не только гарантировано валидный, но еще и thread_safe. После создания все работает без проверок в рантайме.
А вот подход с организацией фильтра входящих данных на уровне языка
Необходимости никакой в на уровне языка нету. Ну вот возьми Scala, где есть на уровне языка
case class MyClass(name: String, age:Int) {
require(IsLatin(name))
require(0<=age && age<=150)
}
Стало легче? Наверное стало, меньше печатать. Геттеры определены сразу. Сеттеров нету. Есть конструкторы копирования со встроеной мутацией данных (x2=x1.copy(age=10)). Но это просто сокращение бойлерплейта, просто удобство
Исправление
vertexua,
:
Но, извините, даже сеттеры и геттеры наверное в 90% случаев реализованы как прокси-сервис к простой записи/чтению переменной без всяких проверок
Стиль программирования на таких языках изменился с годами достаточно сильно. Многие компании на уровне code style поощряют сильное отделение value class от других классов. Первые еще и иммутабельные обычно и создаются с фабриками, в которых стоят валидаторы. Не зависимо от языка, C++ подобный псевдокод выглядит так
class MyClass {
private:
MyClass(...)
public:
MyClass Create(...) {
Validate(IsLatin(name))
Validate(0<=age<=150)
Validate(MatchPhoneNumber(phone_number))
}
// NO SETTERS!
}
Класс нельзя мутировать, нельзя создать через какой-то бекдор невалидным. Потому после создания он не только гарантировано валидный, но еще и thread_safe. После создания все работает без проверок в рантайме.
А вот подход с организацией фильтра входящих данных на уровне языка
Необходимости никакой в на уровне язіка нету. Ну вот возьми Scala, где есть на уровне языка
case class MyClass(name: String, age:Int) {
require(IsLatin(name))
require(0<=age && age<=150)
}
Стало легче? Наверное стало, меньше печатать. Геттеры определены сразу. Сеттеров нету. Есть конструкторы копирования со встроеной мутацией данных (x2=x1.copy(age=10)). Но это просто сокращение бойлерплейта, просто удобство
Исправление
vertexua,
:
Но, извините, даже сеттеры и геттеры наверное в 90% случаев реализованы как прокси-сервис к простой записи/чтению переменной без всяких проверок
Стиль программирования на таких языках изменился с годами достаточно сильно. Многие компании на уровне code style поощряют сильное отделение value class от других классов. Первые еще и иммутабельные обычно и создаются с фабриками, в которых стоят валидаторы. Не зависимо от языка, C++ подобный псевдокод выглядит так
class MyClass {
private:
MyClass(...)
public:
MyClass Create(...) {
Validate(IsLatin(name))
Validate(0<=age<=150)
Validate(MatchPhoneNumber(phone_number))
}
// NO SETTERS!
}
Класс нельзя мутировать, нельзя создать через какой-то бекдор невалидным. Потому после создания он не только гарантировано валидный, но еще и thread_safe. После создания все работает без проверок в рантайме.
А вот подход с организацией фильтра входящих данных на уровне языка
Необходимости никакой в на уровне язіка нету. Ну вот возьми Scala, где есть на уровне языка
case class MyClass(name: String, age:Int) {
require(IsLatin(name))
require(0<=age && age<=150)
}
Стало легче? Наверное стало, меньше печатать. Геттеры определены сразу. Сеттеров нету. Есть кострукторы копирования со встроеной мутацией данных (x2=x1.copy(age=10)). Но это просто сокращение бойлерплейта, просто удобство
Исходная версия
vertexua,
:
Но, извините, даже сеттеры и геттеры наверное в 90% случаев реализованы как прокси-сервис к простой записи/чтению переменной без всяких проверок
Стиль программирования на таких языках изменился с годами достаточно сильно. Многие компании на уровне code style поощряют сильное отделение value class от других классов. Первые еще и иммутабельные обычно и создаются с фабриками, в которых стоят валидаторы. Не зависимо от языка, C++ подобный псевдокод выглядит так
class MyClass {
private:
MyClass(...)
public:
MyClass Create(...) {
Validate(IsLatin(name))
Validate(0<=age<=150)
Validate(MatchPhoneNumber(phone_number))
}
// NO SETTERS!
}
А вот подход с организацией фильтра входящих данных на уровне языка
Необходимости никакой в на уровне язіка нету. Ну вот возьми Scala, где есть на уровне языка
case class MyClass(name: String, age:Int) {
require(IsLatin(name))
require(0<=age && age<=150)
}
Стало легче? Наверное стало, меньше печатать. Геттеры определены сразу. Сеттеров нету. Есть кострукторы копирования со встроеной мутацией данных (x2=x1.copy(age=10)). Но это просто сокращение бойлерплейта, просто удобство