paint-brush
Code Smell 286 - Ата-ана мен бала әдісінің қабаттасуыбойынша@mcsee
Жаңа тарих

Code Smell 286 - Ата-ана мен бала әдісінің қабаттасуы

бойынша Maximiliano Contieri4m2025/01/16
Read on Terminal Reader

Тым ұзақ; Оқу

Ата-ана мен бала сыныптарындағы жеке әдістердің соқтығысуы қателер мен код иістеріне әкелуі мүмкін. Ата-аналық сыныптардағы еншілес сыныптар пайдалана алатын атаулармен нақты атауды сақтау, қабаттасуларды болдырмау және таза код әдістерін орындау арқылы мұны болдырмаңыз.
featured image - Code Smell 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 алшақтығын жасайсыз.

Бұл олқылық әзірлеушілерді шатастырады, ақауларды арттырады және таза код принциптерін бұзады.

AI генерациясы

Жасанды интеллект генераторлары көбінесе ата-ана мен бала қарым-қатынасын тудырған кезде бұл иісті жасайды.

Олар кіру деңгейлерін тексермеуі немесе мұрагерлік салдарларды қарастырмауы мүмкін.

AI анықтау

AI құралдары бұл иісті нақты нұсқаулармен түзете алады.

Сіз AI-дан әдіс атаулары мен рефактор иерархияларының қабаттасуын тексеруді сұрауға болады.


Оларды қолданып көріңіз!

Есіңізде болсын: AI көмекшілері көптеген қателіктер жібереді

Тиісті нұсқауларсыз

Арнайы нұсқаулармен

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


Жауапкершіліктен бас тарту: Код иісі - менің пікірім .

Кредиттер: Unsplash сайтындағы Мэтт Арцтың суреті


Мұрагерлік жақсы, бірақ ол тығыз байланыстыруды енгізетінін ешқашан ұмытпау керек.

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


Бұл мақала HackerNoon сайтындағы CodeSmell сериясының бөлігі болып табылады.


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

ТЕГТЕРДІ АЛУ

БҰЛ МАҚАЛА БАСҚАРҒАН...