Jak zwykle układasz regiony klasy?

17

Zastanawiałem się, czy istnieje standard wyznaczania regionów klasy.

Obecnie używam

Fields
Constructor
Properties
Public Methods
Private Methods

Fieldsbędąc własnością prywatną i Propertiesbędąc własnością publiczną. Zwykle użyję podregionów, jeśli to konieczne, lub od czasu do czasu dodam inne regiony poniżej (takie jak interfejs lub członkowie baseClass).

Rachel
źródło
1
Mówisz ogólnie o układzie, czy używasz „#regions”?
snmcdonald
1
@ snmcdonald Używam #regiontagów do zdefiniowania sekcji
Rachel
Czy nie powinno to być pytanie społecznościowe? Nie wierzę, że istnieje jeden standard, a odpowiedź może się zmienić w zależności od języka.
Raveline,
7
Zaczynam od usunięcia wszystkich #regions
Ed S.
3
@Ed S. +1, ponieważ regiony są diabłem. Wszystko, na co pozwalają, to zasłanianie faktu, że plik kodu jest zbyt duży i wymaga ponownej analizy.
MattDavey,

Odpowiedzi:

4

Wyliczenia związane z klasami lub czasami struktury / klasy czystych danych (powyżej rzeczywistej definicji klasy)

--- Definicja klasy ---

Członkowie prywatni

CTOR / DTOR, jeśli język ma DTOR

Nieruchomości publiczne

Metody użytkowe (prywatne lub chronione metody o małym zakresie)

Funkcjonalność klasy (może być podzielona na wiele regionów w zależności od zakresu klasy).

Pax Noctis
źródło
17

Podregiony? Czy Twoja klasa ma jedną odpowiedzialność ? (domyślnie w tym ... moja odpowiedź brzmi: „Rzadko jakikolwiek region, może z wyjątkiem grupowania właściwości, konstruktorów i metod” ... ale nawet wtedy nie używam go zbyt często)

MIA
źródło
2
Programuję teraz w WPF, a przykładem niektórych podregionów, których chciałbym użyć, jest ViewModel, który ma swoje właściwości publiczne podzielone na właściwości związane z interfejsem użytkownika, polecenia, dane itp. To znacznie ułatwia znalezienie tego, czym jestem szukam szybko
Rachel
2
Dlaczego nie użyć dużych banerów z komentarzami zamiast regionów? // ----------ViewModel Properties---------- W ten sposób nadal możesz zobaczyć kod (lub zwinąć go z konspektem i zobaczyć członków). Regiony służą do ukrywania rzeczy. Kod nie powinien być ukryty, chyba że jest generowany automatycznie lub coś takiego.
Kyralessa
1
@Rachel faworyzuje kompozycję.
MattDavey,
10

Chciałem tylko potwierdzić, że masz na myśli „#regiony”, a nie ogólny układ zajęć.

Dziwi mnie, że nikt nie wspomniał o tym, by unikać korzystania z regionów. Rozumiem, że PO chce przeprowadzić ankietę na temat wyznaczania regionów, ale chciałbym podnieść alternatywny punkt widzenia.

Unikam regionów. Lubię widzieć kod, z którym pracuję. Jeśli trudno ci znaleźć to, czego szukasz, użyj zwijania kodu i grupuj podobne konstrukcje klas razem.

Dlaczego nienawidzę regionów? CTRL+M,Li CTRL+M,Oprzełącza składanie kodu. Jednak po zwinięciu ukrywa cały region. Muszę tylko zwinąć metody / właściwości / komentarze.

Jeśli jest zbyt wiele regionów, być może pachnie kodem, a twoja klasa wykonuje zbyt wiele pracy. Jeff Atwood zapewnia dobry post na temat regionów, które warto przeczytać.

Mój ulubiony cytat na #regionach:

Nie, nie będę używać #regionów. I nie, NIE NEGOCJUJĘ Z TERRORYSTAMI. Zamknij się.

- Jeff Atwood

Biorąc to pod uwagę, wiem, że wielu programistów upiera się przy ich użyciu. To pytanie jest subiektywne. Pomyślałem, że zaoferuję alternatywę.

snmcdonald
źródło
1
Oto makro do zwijania do definicji, ale rozwijania regionów, na wypadek, gdy utkniesz w pracy z ludźmi zakochanymi w regionach: stackoverflow.com/questions/523220/awesome-visual-studio-macros/… Działa dobrze, chyba że jesteś praca z naprawdę chorymi ludźmi, którzy umieszczają regiony w metodach .
Kyralessa
Bardzo przydatne makro! Nie jestem pewien, dlaczego nie wbudowali go w studio wizualne, jednak dziękuję.
snmcdonald
Mój szef uwielbia regiony, kocha je. Uwielbia także prywatne klasy wewnętrzne i ogromne metody. Nasz kod ma jedną klasę podzieloną na około tuzin regionów, 3 klasy wewnętrzne i niektóre metody tak długo, że mają w sobie tuzin regionów najwyższego poziomu, w tym podregiony.
CodexArcanum
4

Różni się w zależności od języka. Ponieważ jestem koderem Delphi, mam tendencję do przestrzegania standardowej konwencji Delphi, która wygląda następująco:

type
  TMyClass = class(TBaseClass)
  private
    private fields
    private methods
  protected
    protected fields
    protected methods
    protected properties
  public
    constructor(s)
    destructor
    public methods
    public properties
  end;

Uważam, że to dobry sposób na uporządkowanie informacji, które są łatwe do odczytania i zrozumienia.

Mason Wheeler
źródło
3
To niesamowite, że prywatne, chronione, publiczne i publikowane są uporządkowane alfabetycznie i enkapsulowane, a wszystkie zaczynają się na P!
Peter Turner,
zabawne, ja nie. Zawsze zdawałem sobie sprawę, że publicnajpierw bardziej naturalne jest umieszczanie na liście , ponieważ większość użytkowników dba tylko o publicrzeczy.
Matthieu M.
Zawsze uważałem tę konwencję za naprawdę głupi pomysł. Co widoczność ma wspólnego z funkcjonalnością? W każdym razie zawsze używałem interfejsów do definiowania publicznej funkcjonalności, ale implementowałem interfejs jako chroniony w klasie. Jedynymi elementami, które będę konsekwentnie grupować, są opublikowane metody i właściwości komponentów, w przeciwnym razie zawsze grupuję według interfejsów i dziedziczenia, używając w razie potrzeby wielu słów kluczowych widoczności. Te elementy, które są unikalne dla implementacji klasy (tj. Nie zastępują), naprawdę powinny być wymienione jako pierwsze.
S.Robins
3

Zazwyczaj układam je w następujący sposób:

Public fields (usually static constants)
Constructors
Public methods
Private methods
Private fields

Nie używałem języka, który używa Properties, dlatego nie są one określone. Umieszczam prywatne metody i pola na dole, ponieważ jeśli ktoś inny używa tego pliku w swoim kodzie, powinien tylko zająć się interfejsem API, który jest sprawą publiczną. Wszystkie znane mi edytory tekstu, a nawet IDE, ustawiają kursor na górze podczas otwierania plików.

gablin
źródło
+1 za umieszczenie prywatnych pól na dole. Pogrupuję metody publiczne według interfejsu, który implementują, i umieszczam te, które nie implementują żadnego interfejsu, u góry, zaraz za konstruktorami / destruktorami.
Sjoerd
2

To dla mnie wezwanie do osądu. Korzystam z regionów, gdy są one potrzebne dla czytelności.

Używam także innego koloru w moim schemacie kolorów Visual Studio (obecnie ciemnoczerwonym), aby wyróżniały się na tle pozostałej części kodu.


Przykład zastosowania #regionu: jeśli napiszę metodę testową dla testu jednostkowego wymagającą wielowierszowego fragmentu kodu XML, łańcuch XML przerwie zwykłe wcięcie (ponieważ zaczyna się wzdłuż lewego marginesu okno kodu. Aby ukryć brzydotę, zawinę ją w region #, aby móc go zwinąć.

Robert Harvey
źródło
2

Książka Czystego Kodu Boba Martina poświęca cały 5 rozdział formatowaniu. Jest kilka kluczowych kwestii, które według mnie ładnie podsumowują.

  • Większość prób grupowania zmiennych i metod według widoczności i czystości Nie ma większego sensu i powoduje, że często poruszasz się po kodzie.
  • Utrzymywanie metod, które nazywają się nawzajem pionowo, zmniejsza ilość nawigacji, którą musisz wykonać, i ułatwia znajdowanie rzeczy.
  • Twój ciąg myśli nie zostanie przerwany, jeśli będziesz musiał się zatrzymać i pomyśleć „w jakim regionie należy ten fragment kodu?” co kilka minut.
  • Zmienne instancji powinny zwykle być nieliczne i powinny być używane wszędzie, dlatego należą one do czołówki klasy, w której najłatwiej je zlokalizować. Zmienne i deklaracje, które będą używane tylko przez jedną metodę, muszą istnieć wewnątrz tej metody. Jeśli są używane tylko przez kilka metod, powinny być blisko w pionie, ale powyżej kilku metod, które ich używają.

Utrzymywanie kodu uporządkowanego z często oddziałującymi elementami w pionie blisko siebie skutecznie eliminuje potrzebę tworzenia określonych regionów. Jeśli twój kod jest tak długi, że wymaga od regionów, aby ukrył dużo kodu, być może jest to zapach kodu wskazujący, że klasa próbuje zrobić zbyt wiele. Być może niektóre funkcje można przenieść do klasy użytkowej lub przekazać przodkowi.

Jeśli musisz „ukryć” kod, ponieważ jest on zbyt długi lub „brzydki”, prawdopodobnie masz większe problemy do zmartwienia niż to, czy chcesz użyć regionów. Osobiście nigdy nie muszę ich używać, a kiedy pracuję nad czyimś kodem, stwierdzam, że i tak zawsze muszę je wszystkie otwierać, więc po co się tym przejmować?

S.Robins
źródło
1
+1 - Jestem zaskoczony, że nie wspomniano o tym bardziej wyraźnie. Zasada spójności dotyczy również tego, jak układasz swój kod, a grupowanie według modyfikatora dostępu jest (najczęściej) nieproduktywne.
Daniel B
0

Obecnie układam takie klasy:

class types
constructors
destructor
accessors
methods
properties (where properties are present in the language)
member variables

a następnie prefiks poziomu dostępu do każdej deklaracji (rodzaj, czasem grupowanie według dostępu). Kiedyś grupowałem na najwyższym poziomie według dostępu, ale w pewnym momencie nie wiem, kiedy to nie działało tak dobrze jak wyżej. Na przykład w C ++ / CLI (z którego jestem obecnie zmuszony korzystać :-() możesz to zrobić, co zakłóca grupowanie według dostępu:

public: property int SomeProperty
{
private: void set (int value) { ... }
public: int get () { ... }
}
Skizz
źródło
Kim są „członkowie” na dole? Dla mnie to ogólny termin na wszystkie elementy klasy.
Mason Wheeler,
@Mason: powinny być „zmiennymi składowymi”, aby uniknąć nieporozumień.
Skizz
Naprawdę nie dostaję grupowania takich typów według typu. Jaka jest naprawdę różnica między metodą a właściwością? Nigdy nie szukałem właściwości klasy, będę jednak szukał logicznie powiązanego kodu, niezależnie od tego, czy są to właściwości, metody, cokolwiek.
Ed S.
0

Szaleńcza odpowiedź: Nie, przynajmniej jeśli chodzi o C #. Pomiędzy Visual Studio i R # Mogę magicznie nawigować do dowolnego członka lub implementacji, więc nie ma sensu mieć obsesji na punkcie tych rzeczy; po prostu zacznij pisać w miejscu, w którym znajduje się kursor.

Wyatt Barnett
źródło
0

Podobnie jak Wyatt i kilka innych odpowiedzi, generalnie również unikam używania regionów. Regiony mają jeden cel; aby ukryć kod, na który nie chcesz patrzeć. Jeśli masz dużo kodu w klasie, na którą nie chcesz patrzeć, a zatem potrzebujesz wielu regionów, aby umożliwić zwinięcie wspomnianego kodu, prawdopodobnie masz za dużo kodu w klasie. ReSharper nie szanuje regionów przy podejmowaniu decyzji, gdzie umieścić nowy kod, chyba że utworzył region (co robi dla implementacji interfejsu).

Jedynym zastosowaniem regionów, które uważam za dopuszczalne, jest ukrycie „nieuchronnie brzydkiego” kodu; kod zajmujący się szczegółowymi szczegółami implementacji, które nie mogą być dobrze zaprojektowane wewnętrznie zgodnie z obecnymi standardami. Zwykle jest to zaawansowany, ezoteryczny kod, który zwykle nie powinien być pomylony przez przeciętnego młodszego programistę po napisaniu. Są to takie rzeczy jak:

  • Niektóre wbudowane implementacje interfejsu (IDisposable, IConvertible, czasem IEnumerable lub IComparable, ponieważ wymagają implementacji ogólnych i nietypowych)
  • Osadzone elementy zewnętrzne P / Invoke i powiązane struktury.
  • Finalizatory / destruktory (zwykle idzie w parze z IDisposable)
  • Przechwytuje niezarządzaną pamięć / wskaźniki / kod „niebezpieczny”.
KeithS
źródło