Formatowanie kodu: rozkładanie funkcji na podstawie hierarchii wywołań w pliku klasy?


10

Sugestia z „Czystego kodu” Boba Martina każe mi drapać się po głowie. „Jeśli raz funkcja wywoła inną, powinny one być pionowo zamknięte, a osoba dzwoniąca powinna znajdować się powyżej odbiorcy”

Jak dotąd mniej więcej trzymałem się wytycznych .Net, które grupują członków klasy według typu (właściwości, lekarze, funkcje) i widoczności (public / prot. / Private). Na początku napiwek wydaje się kłopotem, ale „po prostu może działać”. Osobiście zetknąłem się z przypadkami, w których podobał mi się ten układ - łatwiejsze drążenie w dół, gdy jesteś we właściwym łańcuchu połączeń.

Pomysł wydaje się słuszny, ale inne scenariusze, takie jak „pozwól mi spojrzeć na publiczny interfejs tej klasy” mogą się pogorszyć. Może wujek Bob korzysta z małych klas i wsparcia IDE dla typów wyświetlania ...

Czy ktoś próbował tego przez dłuższy czas?

Aktualizacja: Wydaje się, że fragment kodu jest w porządku

class SomeType()
{
  /// fields, ctors, et. all
  public void Method1()   { // calls HelperMethod1 and HelperMethod2 }
  private void HelperMethod1 { // calls HelperMethod3 }
  private void HelperMethod3 {}
  private void HelperMethod2 {}

  public void Method2 () { // and so on... }

}

2
Upiorny „Wujek Bob” nie jest najostrzejszym ołówkiem w pudełku.
Neil Butterworth,

1
Chodzi o to, że „daj mi duży obraz przed drobiazgowymi szczegółami”. Dostosuj w razie potrzeby.
Ryan Culpepper

2
Orły muszą być już blisko powrotu do siebie, ponieważ zgadzam się z komentarzem Neila. Dorastałem z PASCAL i „postawiłem małe rzeczy na pierwszym miejscu”, ponieważ kompilatory PASCAL wymagały zdefiniowania wszystkich rzeczy przed odwołaniem się do nich, a deklaracje DO PRZODU były zasadniczo niezadowolone.
John R. Strohm,

@ Neil - staram się ocenić zasadność porady .. niezależnie od źródła. @ John - a wskazówka jest przeciwieństwem deklaracji przekazywania. Na pierwszym miejscu stawiasz dzwoniącego. Odbiorcy są zadeklarowani tuż pod dzwoniącymi.
Gishu,

@ryanc - we wstępie do tego akapitu podkreślono, że pojęcia „blisko powiązane / spójne” powinny być pionowo blisko siebie [Zapobiega przewijaniu się, gdy próbujesz coś wymyślić]. Wywoływane funkcje są umieszczone poniżej osoby wywołującej w kolejności połączeń. Zobacz dodany fragment kodu
Gishu,

Odpowiedzi:


2

Być może wychodzę tutaj na kończynę, ale zastanawiam się, czy narzędzie, którego używasz, ma na to wpływ. Mam na myśli edytor tekstu kontra decyzję IDE, którą muszą podjąć programiści.

W IDE masz o wiele więcej funkcji do przeglądania plików źródłowych. Zazwyczaj można uzyskać listę metod posortowanych alfabetycznie, według widoczności, a nawet zwrócić typ na pasku bocznym. Możesz także przejść do metody, jeśli masz do niej zastosowanie. Możesz także generować drzewa połączeń dla metod i drążenia w dół. Zwykle masz także potężne polecenie find, które może obsługiwać wyrażenia regularne. W tej sytuacji kolejność tworzonych metod nie ma znaczenia, ponieważ dostępne są widoki inne niż kod źródłowy.

W edytorze tekstów zazwyczaj nie masz tych funkcji - najbliższe, które będziesz mieć, to prawdopodobnie silne wyszukiwanie / zamiana. W tym miejscu będziesz chciał zwrócić większą uwagę na strukturę pliku, ponieważ nawigacja może być trudniejsza. Chcesz zminimalizować czas przewijania pliku, aby znaleźć to, czego szukasz, a spójna i logiczna kolejność metod może pomóc.


+1 dla IDE; im lepsze IDE, tym mniej trzeba się martwić o takie rzeczy
user281377

1

Chodzi o to, że nazywane rzeczy są mniej interesujące niż nazywanie rzeczy. Im bardziej metoda wywołuje inne metody, tym bardziej prawdopodobne jest, że metoda ta jest częścią zewnętrznego interfejsu API obiektu (w przeciwieństwie do szczegółów implementacji). Oznacza to, że zewnętrzny interfejs API klasy - metody publiczne, jeśli twój język obsługuje tę koncepcję - będzie naturalnie „chciał” znajdować się na górze pliku, ułatwiając znalezienie tych metod. I odwrotnie, funkcje pomocnicze i takie będą „chciały” znajdować się na dole pliku.

(Wyjaśniam pojęcie, nie oceniając jego skuteczności).


Tak, ale oznaczałoby to, że wszystkie funkcje publiczne powinny unosić się na górze pliku jako jedna grupa. konwencjonalne podejście. Proponowane podejście jest inne (a przynajmniej tak, jak to czytam) .. zobacz aktualizację w pytaniu
Gishu,

Tak, rzeczywiście, twoje funkcje publiczne powinny unosić się na górze. Oczywiście niektóre języki w ogóle nie mają modyfikatorów widoczności ...
Frank Shearar

1

Jeśli przez dłuższy okres masz na myśli więcej niż kilka dni? Potem nie
. Kilka lat temu zacząłem to robić na nowym kodzie i powoli doprowadzałem się do szaleństwa, aż przestałem.

Moja osobista preferencja dla klas jest układanie

class MyClass
{
    // static fields
    // fields
    // constructors
    // properties
    // methods
} 

Ale to nie jest religijne, właściwości i metody mogą się ze sobą łączyć. Widoczność nie wchodzi w to (nie grupuję według publicznego / chronionego / prywatnego)

Mamy tu faceta, który ma ścisłą strukturę wszystkiego w pliku klasy, a wszystko jest zgrupowane razem w głównych grupach i podgrupach, wszystkie ładnie zagnieżdżone w regionach. . . Muszę przyznać, że uważam, że regiony są dziełem Szatana, a one napędzają mnie dookoła tego dziwnego kroku.

Za każdym razem, gdy otwieram jedną z jego zajęć, umieram trochę w środku :(


Nie opowiadam się za dużymi zajęciami z regionami dodanymi do maskowania zapachu. Nie staranie się o religijność ... ale spójny układ w projekcie przyspiesza wszystko - wiedząc, gdzie szukać. Grupowanie widoczności bu jako dodatkowej korzyści z faktu, że publiczny interfejs API jest blisko siebie, dzięki czemu można znaleźć konkretny punkt wejścia i przejść z tego miejsca ...
Gishu

A konstruktorów? Są to „metody”?
Cody Gray,

@Cody Gray: Przepraszam, zapomniałem lekarzy!
Binary Worrier

@Gishu: Uważam, że nowoczesne narzędzia do wizualizacji i nawigacji usunęły potrzebę ścisłego układu plików. Czy ma znaczenie, gdzie metoda jest wdrażana, kiedy mogę kliknąć prawym przyciskiem myszy użycie i „Idź do definicji”?
Binary Worrier
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.