„Zewnętrzne” w tym kontekście oznacza „obserwowalne dla użytkowników”. Użytkownicy mogą być ludźmi w przypadku aplikacji lub innych programów w przypadku publicznego API.
Jeśli więc przeniesiesz metodę M z klasy A do klasy B, a obie klasy znajdują się głęboko w aplikacji, a żaden użytkownik nie zauważy żadnej zmiany w zachowaniu aplikacji z powodu tej zmiany, możesz słusznie nazwać to refaktoryzacją.
Jeśli, OTOH, jakiś inny podsystem / komponent wyższego poziomu zmieni swoje zachowanie lub ulegnie awarii z powodu zmiany, jest to rzeczywiście (zwykle) obserwowalne dla użytkowników (lub przynajmniej dla sysadminów sprawdzających logi). Lub jeśli twoje klasy były częścią publicznego API, może istnieć kod innej firmy, który zależy od tego, czy M jest częścią klasy A, a nie B. Więc żaden z tych przypadków nie jest refaktoryzujący w ścisłym tego słowa znaczeniu.
istnieje tendencja do wywoływania przeróbek kodu jako refaktoryzacji, co, jak sądzę, jest nieprawidłowe.
Rzeczywiście, jest to smutna, ale oczekiwana konsekwencja modnego refaktoryzacji. Deweloperzy od dawna wykonują przeróbki kodu w sposób ad hoc iz pewnością łatwiej jest nauczyć się nowego modnego hasła niż analizować i zmieniać zakorzenione nawyki.
Jakie jest zatem właściwe słowo dla przeróbek, które zmieniają zachowanie zewnętrzne?
Nazwałbym to przeprojektowaniem .
Aktualizacja
Wiele ciekawych odpowiedzi na temat interfejsu, ale czy przeniesienie metody refaktoryzacji nie zmieni interfejsu?
Czego? Konkretne klasy, tak. Ale czy te klasy są w jakikolwiek sposób bezpośrednio widoczne dla świata zewnętrznego? Jeśli nie - ponieważ są one w twoim programie i nie są częścią zewnętrznego interfejsu (API / GUI) programu - żadna dokonana tam zmiana nie jest obserwowana przez podmioty zewnętrzne (chyba że zmiana coś oczywiście psuje).
Wydaje mi się, że istnieje głębsze pytanie: czy konkretna klasa istnieje jako samodzielna jednostka? W większości przypadków odpowiedź brzmi „ nie” : klasa istnieje tylko jako część większego komponentu, ekosystemu klas i obiektów, bez których nie można utworzyć instancji i / lub jest bezużyteczna. Ekosystem ten obejmuje nie tylko jego (bezpośrednie / pośrednie) zależności, ale także inne klasy / obiekty, które od niego zależą. Wynika to z faktu, że bez tych klas wyższego poziomu odpowiedzialność związana z naszą klasą może być bez znaczenia / bezużyteczna dla użytkowników systemu.
Np. W naszym projekcie dotyczącym wynajmu samochodów jest Charge
klasa. Ta klasa sama w sobie nie jest użyteczna dla użytkowników systemu, ponieważ agenci wynajmu stacji i klienci nie mogą wiele zrobić z indywidualną opłatą: zajmują się umowami najmu jako całością (które obejmują wiele różnych rodzajów opłat) . Użytkownicy są najbardziej zainteresowani sumą tych opłat, które ostatecznie mają zapłacić; agent jest zainteresowany różnymi opcjami umowy, długością wynajmu, grupą pojazdów, pakietem ubezpieczenia, dodatkowymi przedmiotami itp. itd., które (na podstawie wyrafinowanych reguł biznesowych) regulują obecne opłaty i sposób obliczania płatności końcowej z tych. Przedstawiciele krajów / analitycy biznesowi dbają o szczegółowe reguły biznesowe, ich synergię i efekty (na dochody firmy itp.).
Niedawno zreorganizowałem tę klasę, zmieniając nazwę większości jej pól i metod (zgodnie ze standardową konwencją nazewnictwa Java, która została całkowicie zaniedbana przez naszych poprzedników). Planuję również dalsze refaktoryzacje, aby zastąpić String
i char
pola bardziej odpowiednie enum
i boolean
typy. Wszystko to z pewnością zmieni interfejs klasy, ale (jeśli wykonam swoją pracę poprawnie) żadne z nich nie będzie widoczne dla użytkowników naszej aplikacji. Żadnemu z nich nie zależy na tym, w jaki sposób reprezentowane są poszczególne ładunki, mimo że na pewno znają pojęcie ładunku. Mógłbym wybrać jako przykład sto innych klas nie reprezentujących żadnego pojęcia domeny, więc będąc nawet koncepcyjnie niewidocznym dla użytkowników końcowych, ale pomyślałem, że bardziej interesujące jest wybranie przykładu, w którym przynajmniej widoczność jest na poziomie koncepcji. Ładnie pokazuje to, że interfejsy klasowe są jedynie reprezentacjami pojęć domenowych (w najlepszym wypadku), a nie rzeczywistością *. Reprezentację można zmienić bez wpływu na koncepcję. Użytkownicy mają tylko i rozumieją tę koncepcję; naszym zadaniem jest mapowanie koncepcji i reprezentacji.
* I można łatwo dodać, że model domeny, który reprezentuje nasza klasa, sam w sobie jest jedynie przybliżoną reprezentacją jakiejś „prawdziwej rzeczy” ...