Якщо хтось пише код таким чином, щоб внутрішня змінна $ _fields була доступна без використання методів getter / setter, чи є відповідний термін, який використовується для опису цього?
Щось ввічливе для використання з управлінням :)
Якщо хтось пише код таким чином, щоб внутрішня змінна $ _fields була доступна без використання методів getter / setter, чи є відповідний термін, який використовується для опису цього?
Щось ввічливе для використання з управлінням :)
Відповіді:
Викриття приватних членів ніколи не є доброю справою ввічливого суспільства ...
Така практика - відсутність / погана інкапсуляція.
private
) має ще одну реалізацію концепції інкапсуляції.
__
для керування іменами). Інші мови також можуть мати погану інкапсуляцію, наприклад, відображення в Java та арифметична вказівник на C ++, щоб отримати приватні змінні. Python просто не робить синтаксис, щоб зробити це громіздко.
__
іменами. Без __
цього дизайн все ще відображає хорошу інкапсуляцію. Стверджувати, що "громадськість" означає "відсутність / погана інкапсуляція" - неправильно. Концепція все ще присутня. У вихідному коді немає відповідного декору.
Окрім відсутності інкапсуляції, про яку вже говорив Одєд, залежно від мови програмування та його парадигм це може бути також "простими старими даними" (де це не обов'язково антипатерн або кодовий запах).
Його називають мішком власності.
Зазвичай він використовується для зберігання набору пов'язаних з можливостями властивостей (кожен потенційно може бути об'єктом класу, який має відповідні специфікатори доступу чи ні). Але навколишня структура - лише мішок властивостей.
Це називається "не дотримання конкретного стандарту кодування".
В ОП написано:
доступна внутрішня змінна $ _fields без використання методів getter / setter
Це може суперечити вашому стандарту, і (таким чином) це може бути запах коду. Але це не обов'язково погана інкапсуляція. Викриття внутрішньої (як у "лише внутрішнього використання") змінної над геттером та сетером зовнішньому світу було б ще гірше.
Питання: чи має $_fields
бути доступним для зовнішнього світу?
Якщо так, у нас є випадок, коли ви б додали методи getter / setter. Ці методи не інкапсулюють нічого, окрім того, що $_fields
є певною змінною (на відміну від чогось обчисленого / вилученого / тощо. На льоту). Залежно від мови, ви, ймовірно, все ще будете просочувати тип (він же деталі реалізації) зовні. Незалежно від того, чи завжди ви хочете отримати геттерів / сеттерів, або лише тоді, коли "потрібно", це стандартне питання кодування.
Якщо $_fields
це не може бути доступним, то, ну, не отримуйте доступу до нього. Незалежно від того, чи варто заважати іншим отримувати доступ до нього на мовному рівні (приватні та друзі) чи ні (що може полегшити налагодження в певних обставинах) - це знову-таки стандартна проблема кодування.
Питання інкапсуляції цілком ортогональне для цього. Порушувати інкапсуляцію абсолютно можливо з геттерами та сетерами. Це навіть простіше прослизнути, тому що дзвінки тривоги більшості людей не дзвонять, коли вони бачать купу геттерів та сеттерів - код, який, здавалося б, відповідає найкращим практикам. Кодекс, який може ввести набагато більше залежностей від внутрішніх відомостей про реалізацію, ніж змінну, яку називають, $_fields
яка не визначається як private
.
Я прихильник поганих аналогій: Називати цю погану інкапсуляцію - це як називати когось, хто тримає пістолет, вбивцею.
Я б назвав такі змінні загальнодоступними змінними .
якщо ваші методи сеттера / геттера є не що інше
void setfoo(bar){foo=bar;}
foo getfoo{return foo;}
то просто створення лобкової змінної - це просто збереження деяких типів тексту за межами кількох крайових випадків, коли різниця має значення.