paint-brush
Запах коду 286 – метод «батько-дочірній» збігаєтьсяза@mcsee
Нова історія

Запах коду 286 – метод «батько-дочірній» збігається

за Maximiliano Contieri4m2025/01/16
Read on Terminal Reader

Надто довго; Читати

Колізії приватних методів у батьківських і дочірніх класах можуть призвести до помилок і запахів коду. Уникайте цього, зберігаючи чітке іменування, уникаючи перекривання та дотримуючись чистого коду practices.te методів у батьківських класах з іменами, які можуть використовувати дочірні класи.
featured image - Запах коду 286 – метод «батько-дочірній» збігається
Maximiliano Contieri HackerNoon profile picture
0-item

Коли батьківський і дитячий методи стикаються!


TL;DR: уникайте використання приватних методів у батьківських класах з іменами, які можуть використовувати дочірні класи.

Проблеми

  • Порушення принципу найменшої несподіванки
  • Несподівана поведінка та дефекти
  • Приховані залежності
  • Обмежена розширюваність
  • Неясність коду
  • Порушення принципу відкритості/закритості
  • Оманливий дизайн

Рішення

  1. Уникайте ієрархії
  2. Перейменувати приватні методи
  3. Дотримуйтеся чіткого найменування
  4. Уникайте дублювання імен
  5. Уникайте захищених методів
  6. Підкласифікуйте для основних зв’язків , а не для повторного використання коду

Контекст

Коли ви використовуєте однакову назву методу в батьківських і дочірніх класах, ви створюєте плутанину.

Приватний метод у батьківському класі не можна перевизначити, навіть якщо публічний метод із такою ж назвою існує в дочірньому класі.

Це проблема більшості статичних мов у своєму дизайні. Це роз’єднання призводить до помилок і ускладнює підтримку коду.

Зразок коду

неправильно

 <? class ParentClass { private function greet() { // This method is private return "Hello from ParentClass"; } public function callGreet() { return $this->greet(); } } class ChildClass extends ParentClass { public function greet() { // Overriding a concrete method is a code smell // Compilers SHOULD warn you return "Hello from ChildClass"; } } $child = new ChildClass(); echo $child->callGreet(); // When callGreet() is invoked on the $child object, // it executes the following: // It calls $this->greet(), // which refers to the greet() method of ParentClass // because the original method is private // and cannot be overridden or accessed from ChildClass. // The unexpected output is 'Hello from ParentClass'

правильно

 <? class ParentClass { protected function greet() { // notice the 'protected qualifier' return "Hello from ParentClass"; } public function callGreet() { return $this->greet(); } } class ChildClass extends ParentClass { public function greet() { return "Hello from ChildClass"; } } $child = new ChildClass(); echo $child->callGreet(); // The output is "Hello from ChildClass" // This is the standard (and wrong) solution // Also fixed by most AIs
 <? abstract class ParentClass { // Declare greet() as an abstract method // Following the template-method design pattern abstract protected function greet(); public function callGreet() { return $this->greet(); } } class ChildClass extends ParentClass { protected function greet() { return "Hello from ChildClass"; } } class OtherChild extends ParentClass { protected function greet() { return "Hello from OtherChild"; } } $child = new ChildClass(); echo $child->callGreet(); // Output: Hello from ChildClass $otherChild = new OtherChild(); echo $otherChild->callGreet(); // Output: Hello from OtherChild

виявлення

  • [x] Напівавтоматичний

Ви можете виявити цей запах, шукаючи приватні методи в батьківських класах і перевіряючи, чи дочірні класи визначають методи з однаковою назвою. Ви також повинні протестувати батьківські методи, викликаючи приватні методи.

Теги

  • Ієрархія

Рівень

  • [x] Середній рівень

Чому бієкція важлива

Чіткий і передбачуваний код повинен відображати ієрархію реального світу, яку він моделює.

Коли ви використовуєте приватні методи з іменами, що перекриваються, ви створюєте розрив Bijection між моделлю та реалізацією.

Ця прогалина заплутує розробників, збільшує кількість дефектів і порушує принципи чистого коду.

ШІ покоління

Генератори штучного інтелекту часто створюють цей запах, коли створюють шаблонні стосунки «батьки-діти».

Вони можуть не перевіряти рівні доступу або враховувати наслідки успадкування.

Виявлення ШІ

Інструменти ШІ можуть виправити цей запах за допомогою чітких інструкцій.

Ви можете попросити штучний інтелект перевірити назви методів та ієрархії рефакторів, які збігаються.


Спробуйте їх!

Пам’ятайте: помічники ШІ роблять багато помилок

Без відповідних інструкцій

З конкретними інструкціями

ChatGPT

ChatGPT

Клод

Клод

Розгубленість

Розгубленість

Другий пілот

Другий пілот

Близнюки

Близнюки

Висновок

При проектуванні батьківських і дочірніх класів ви повинні використовувати методи, які чітко визначають успадкування та доступність.

Уникайте приватних методів, які накладаються на дочірні методи. Це зберігає ваш код читабельним, розширюваним і узгодженим із принципами чистого коду.

Такі мови, як Python, дозволяють перевизначати батьківські методи незалежно від їхніх імен, тоді як Java суворо забезпечує рівні доступу.

C# поводиться подібно до Java . Ці відмінності означають, що вам потрібно розуміти конкретні правила мови, з якою ви працюєте, щоб уникнути несподіваної поведінки.

Відносини

https://hackernoon.com/how-to-find-the-stinky-parts-of-your-code-part-xxviii

https://hackernoon.com/how-to-find-the-stinky-parts-of-your-code-part-xii

https://hackernoon.com/how-to-find-the-stinky-parts-of-your-code-part-iii-t7h3zkv

https://hackernoon.com/how-to-find-the-stinky-parts-of-your-code-part-xxv

https://hackernoon.com/how-to-find-the-stinky-parts-of-your-code-part-viii-8mn3352


Відмова від відповідальності: Code Smells — це моя думка .

Кредити: фото Метта Арца на Unsplash


Спадкування – це добре, але ви ніколи не повинні забувати, що воно вводить тісний зв’язок.

Роберт С. Мартін


Ця стаття є частиною серії CodeSmell на HackerNoon.


L O A D I N G
. . . comments & more!

About Author

Maximiliano Contieri HackerNoon profile picture
Maximiliano Contieri@mcsee
I’m a sr software engineer specialized in Clean Code, Design and TDD Book "Clean Code Cookbook" 500+ articles written

ПОВІСИТИ БИРКИ

ЦЯ СТАТТЯ БУЛА ПРЕДСТАВЛЕНА В...