Ата-ана мен бала әдістері соқтығысқанда!
TL; DR: еншілес сыныптар пайдалана алатын атаулары бар ата-аналар сыныптарында жеке әдістерді пайдаланудан аулақ болыңыз.
Ата-ана және еншілес сыныптарда бірдей әдіс атауын пайдаланған кезде, шатасушылық тудырасыз.
Ата-аналық сыныптағы жеке әдісті тіпті еншілес сыныпта бірдей атаумен жалпыға бірдей әдіс бар болса да, қайта анықтау мүмкін емес.
Бұл көптеген статикалық тілдердің дизайнында болатын мәселе. Бұл ажырату қателерге әкеледі және кодты сақтауды қиындатады.
<? 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
Бұл иісті ата-аналық сыныптардағы жеке әдістерді іздеу және еншілес сыныптар бірдей атпен әдістерді анықтайтынын тексеру арқылы анықтауға болады. Сондай-ақ жеке әдістерді шақыратын ата-аналық әдістерді тексеру керек.
Ашық және болжамды код ол модельдейтін нақты әлем иерархиясын көрсетуі керек.
Қайталанатын атаулары бар жеке әдістерді пайдаланған кезде, үлгі мен іске асыру арасында Bijection алшақтығын жасайсыз.
Бұл олқылық әзірлеушілерді шатастырады, ақауларды арттырады және таза код принциптерін бұзады.
Жасанды интеллект генераторлары көбінесе ата-ана мен бала қарым-қатынасын тудырған кезде бұл иісті жасайды.
Олар кіру деңгейлерін тексермеуі немесе мұрагерлік салдарларды қарастырмауы мүмкін.
AI құралдары бұл иісті нақты нұсқаулармен түзете алады.
Сіз AI-дан әдіс атаулары мен рефактор иерархияларының қабаттасуын тексеруді сұрауға болады.
Оларды қолданып көріңіз!
Есіңізде болсын: AI көмекшілері көптеген қателіктер жібереді
Тиісті нұсқауларсыз | Арнайы нұсқаулармен |
---|---|
Ата-аналық және еншілес сыныптарды құрастырған кезде мұраны және қол жетімділікті нақты анықтайтын әдістерді пайдалану керек.
Балалар әдістерімен қабаттасатын жеке әдістерден аулақ болыңыз. Бұл сіздің кодыңызды оқуға, кеңейтуге және таза код принциптеріне сәйкестендіруге мүмкіндік береді.
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 сериясының бөлігі болып табылады.