Jedna klasa na regułę pliku w .NET? [Zamknięte]


185

Stosuję się do tej zasady, ale niektórzy z moich kolegów nie zgadzają się z nią i twierdzą, że jeśli klasa jest mniejsza, można ją zostawić w tym samym pliku z innymi klasami.

Kolejny argument, który słyszę przez cały czas, brzmi: „Nawet Microsoft tego nie robi, więc dlaczego mielibyśmy?”

Jaki jest ogólny konsensus w tej sprawie? Czy istnieją przypadki, w których należy tego unikać?


1

Odpowiedzi:


176

Jedna klasa na plik daje także lepszy obraz tego, co zmienia się przy każdym zameldowaniu, bez patrzenia na różnice w pliku.


4
Więcej klas w tym samym pliku zwiększa różnicę między klasami pokrewnymi tylko w jednej operacji.
Luca,

3
Właściwe przeglądarki różnic umożliwiają przeglądanie wszystkich różnic jednego zatwierdzenia.
Dykam

44
Nie jestem do końca pewien, w jaki sposób ta konkretna odpowiedź jest odpowiedzią na pytanie (pytania) oryginalnego postu. Pewnie, że zapewnia powód, aby zachować 1 klasę do pliku (chociaż Luca i Dykam robią dobre rzeczy), ale nie odzwierciedla ogólnego konsensusu ani nie podaje przypadków, w których należy tego unikać.
Robert Davis,

4
Najlepsze praktyki nie istnieją, jeśli uważasz, że w najlepszych praktykach rozumiesz, że dotyczą one tylko określonego kontekstu. Jak wskazują inne odpowiedzi, zdarzają się sytuacje, w których ta reguła faktycznie tworzy mniej konserwowalny kod. Gdy narzędzia stają się lepsze, ta zasada staje się mniej istotna, ponieważ znacznie łatwiej jest znaleźć klasy i typy w projekcie.
romb

263

Nienawidzę tego, gdy ludzie myślą absolutnie i mówią, że nigdy nie powinieneś tego robić z czymś subiektywnym i wybrednym jak ten, tak jakbyśmy wszyscy musieli dostosować się do czyichś głupich pomysłów na dobro i zło. Podsumowując: posiadanie więcej niż jednej klasy na plik jest całkowicie w porządku, jeśli ma to sens. Przez sens rozumiem takie rzeczy jak:

  1. Ułatwia trawienie i utrzymanie kodu
  2. Sprawia, że ​​rozwiązanie jest mniej denerwujące (przewijanie niepotrzebnych plików) i mniej powolne
  3. Zespół programistów jest w porządku jako lokalna praktyka kodowania

Naprawdę dobry przykład, dlaczego mogę chcieć wielu klas na plik:

Powiedzmy, że mam kilkadziesiąt niestandardowych klas wyjątków, każda z nich jest czterowarstwowa, mógłbym mieć osobny plik dla każdej z nich lub mógłbym grupować wyjątki i mieć plik na grupę. Dla mnie najbardziej racjonalnym / pragmatycznym podejściem jest grupowanie ich i posiadanie tylko kilku plików, ponieważ jest to bardziej efektywne pod względem czasu / kodowania (nie muszę klikać prawym przyciskiem myszy -> Dodaj klasę, zmieniaj nazwę, 50 razy) , dzięki temu rozwiązanie jest mniej zagracone i ma lepszą wydajność.


92
+1,000. Zrozumienie uzasadnienia najlepszych praktyk i dwukrotne przemyślenie przed ich naruszeniem jest świetne. Słowiańskie przylgnięcie jest złe.
dsimcha

19
Kilkadziesiąt niestandardowych klas wyjątków ? Czy to nie jest prawdziwe źródło problemu? Nie chcę tu tylko być wybredny: myślę, że przez większość czasu ludzie chcą łączyć klasy w jeden plik, ponieważ niepotrzebnie tworzą zbyt wiele typów. (Powiedziawszy to, być może istnieje rzeczywisty przypadek, w którym ma sens kilkadziesiąt niestandardowych klas wyjątków). Liczne małe, nieopracowane klasy są zwykle oznaką większego problemu.
Jeff Sternal

16
W większości się z tobą zgadzam. Ale wyjątki są szczególnym przypadkiem. Ponieważ odpowiednio zaprojektowany system musi mieć odpowiednią obsługę wyjątków, aby poradzić sobie ze wszystkimi przypadkami, w których występują uzasadnione błędy, większość artykułów na temat najlepszych praktyk, które przeczytałem, podkreśla potrzebę tworzenia określonych wyjątków (a czasami trzeba ich dużo, aby obejmują wszystkie reguły biznesowe w dużym projekcie), aby nie dopuścić do przechwycenia wyjątku system.exception, który w ogóle nie jest poprawną obsługą wyjątków.
James

6
Zgadzam się, że nie powinieneś niewolniczo przestrzegać pewnych wytycznych bez uzasadnionego powodu, jednak nie zgadzam się z tym, że powinieneś mieć więcej niż jedną klasę w pliku. Dla mnie plik powinien mieć nazwę od klasy i nie może zawierać więcej niż jednego. Niektóre języki (java to jeden) odnotowują faktyczne wymuszanie, że klasa znajduje się w pliku o nazwie zgodnej z nazwą klasy. Dla mnie nowicjuszom łatwiej jest nawigować, dlatego uważam, że jedna klasa na plik jest słuszna
krystan honoruje

3
Utrzymywanie jednej klasy na plik i synchronizowanie nazwy pliku i klasy jest konwencją, podobnie jak nazywanie zmiennych. Visual Studio jest bardzo dobrze dostosowane do tego podejścia. Ułatwia to system kontroli źródła i programistów dodawanych w trakcie projektu. Będą intuicyjnie wyszukiwać nazwę pliku pasującą do nazwy klasy.
Oybek

75
static bool GeneralRuleShouldBeFollowed(IGeneralRule rule, IUseCase useCase)
{
    return (rule.Overhead(useCase) 
            < My.PersonalThresholds.ConformismVsPracticality);
}

4
Czy istnieje taka reguła w .NET? Ja również zwróciłbym właśnie wynik wyciągu. : O
Joan Venge

50

Czasami grupuję więcej niż jedną klasę w pliku, jeśli są one ściśle powiązane, a przynajmniej jedna z nich jest bardzo mała.

Ogólną „najlepszą praktyką” jest posiadanie jednego pliku na klasę.


7
Jeśli rozpoznasz, że są sprzężone, dlaczego ich nie odłączysz?
Matt

39
@ Matt: Nazywa się to unikaniem nadmiernej inżynierii. Jeśli masz kilka ściśle powiązanych klas, a ich oddzielenie spowodowałoby dużo komplikacji w porównaniu z ilością praktycznej elastyczności, jaką zapewnia, to po co?
dsimcha

9
Czasami lubię w zasadzie klasy „danych”, które są używane tylko przez tę jedną klasę, dlatego zwykle umieszczam klasę danych w tym samym pliku, co użytkownik, ponieważ klasa danych zwykle nie ma żadnej logiki i sama w sobie wydaje się marnuj, aby utworzyć dla niego nowy plik.
Earlz

3
@ Matt: Czasami są klasy pomocnicze, które uważam za dopuszczalne. Zmniejszają złożoność części innej klasy, ale nadal ułatwiają bardzo konkretny cel tej klasie.
Jordan Parmer,

6
@TheMatt: Oddziel to: msdn.microsoft.com/en-us/library/… Połączenie między modułami jest złe, ale współpraca między klasami w ramach funkcji logicznej jest nieunikniona.
Ben Voigt,

25

Oprócz hipotetycznych argumentów i skupiania się zamiast tego na Windows .NET z Visual Studio IDE i rozwijającymi się projektami oprogramowania, w tym kontekście po prostu sensowne jest posiadanie jednej klasy na plik.


Ogólnie rzecz biorąc, dla odniesienia wizualnego nic nie przebije jednej klasy na plik. Naprawdę.

Nie wiem, czy Microsoft robi to samo, czy nie, jednak utworzyli partialsłowo kluczowe, aby podzielić jedną klasę na wiele plików (jest to nawet bardziej dotkliwe). Często służy do dzielenia automatycznie generowanego kodu projektanta z kodu niestandardowego w tej samej klasie (ale czasami jest używana, aby umożliwić różnym programistom pracę nad klasą w tym samym czasie za pomocą różnych plików). Tak więc Microsoft dostrzega zalety wielu plików i wszyscy mają na myśli wiele przemyśleń dotyczących organizacji plików z .NET.

W przypadku klas zagnieżdżonych nie masz innego wyboru, jak użyć jednego pliku lub przynajmniej pierwszych części klas w nich zawartych. W tym przypadku konieczny jest jeden plik:

class BicycleWheel {
    class WheelSpoke {
    }
}

W przeciwnym razie dlaczego miałbyś przechowywać wiele klas w jednym pliku? Argument „ponieważ są małe” lub powiązane ze sobą , nie zawiera dużej ilości wody, ponieważ ostatecznie twoje klasy zostaną powiązane z innymi klasami. Ostatecznie nie można łatwo wywnioskować organizacji obiektów w pliku na podstawie ich użycia, zwłaszcza w miarę rozwoju oprogramowania.

Dodatkowo, jeśli używasz folderów dla przestrzeni nazw , nigdy nie będziesz mieć konfliktu nazw plików klas. Wygodne jest także zlokalizowanie klasy według nazwy pliku w systemie plików, gdy nie znajduje się ona w środowisku programistycznym, takim jak Visual Studio (np. Jeśli chcesz szybko edytować klasę za pomocą Notatnika lub czegoś szybkiego / lekkiego ).

Tyle dobrych powodów ...


Dzięki, co rozumiesz przez „przynajmniej pierwsze ich części”? Masz na myśli, że możesz także rozdzielić zagnieżdżone klasy?
Joan Venge

1
To pośrednie odniesienie do partialsłowa kluczowego, o którym wspomniałem.
John K,

1
Dla zapisu zagnieżdżone klasy mogą być partial msdn.microsoft.com/en-us/library/wa80x488(VS.80).aspx Spojrzałem na to z ciekawości.
John K,

Pokazuje to tylko, że domyślny widok powinien być logiczny (przestrzeń nazw / klasa), a nie fizyczny (pliki).
David Schmitt

@DavidSchmitt, do czego służy widok klasy w Visual Studio.
Zack,

14

W zdecydowanej większości przypadków stosuję regułę jednej klasy na plik. Jedynym wyjątkiem, który regularnie robię, jest definicja wyliczenia ściśle powiązanego z określoną klasą. W takim przypadku często dołączam definicję wyliczenia do pliku tej klasy.


12

Ja również uważam, że w jednym pliku powinien znajdować się jeden typ.

Jest jeden wyjątek od tej reguły, o którym należy wspomnieć: Posiadanie dwóch klas, które różnią się jedynie ogólnym argumentem, takim jak:

RelayCommand     

i

RelayCommand<T>

Czy znasz obejście, które sprawi, że StyleCop będzie szczęśliwy w tym przypadku?
George Polevoy,

Nie zgadzam się, istnieje inna konwencja dla klas ogólnych, Foo 1.cs for Foo <T> `i Foo 2.cs for Foo <T, T1>`.
Oybek

@Oybek: Co jeśli mam Foo <T>, Foo <U> i Foo <U, T>? Co teraz?
Andrei Rînea

@AndreiRinea Nie można mieć Foo<T>ani Foo<U>w tej samej przestrzeni nazw. Ale jeśli przestrzenie nazw różnią się, zwykle znajdują się w różnych folderach. Zatem dla Foo<T>i Foo<U>powinno to być Foo 1.cs and for Foo <U, T> `Foo`2.cs. Ale nadal jedna klasa na plik.
Oybek

Dziękuję za informację! :)
Andrei Rînea

8

Naprawdę sprowadza się to do osobistych preferencji. Wszyscy powiedzą „jedna klasa na plik”, ale wszyscy mamy powody, aby tego uniknąć w pewnych okolicznościach. Kiedyś miałem duży projekt, który miał około 300 różnych wyliczeń. Nie ma mowy, żebym miał 300 osobnych plików, po jednym dla każdej klasy, gdy niektóre wyliczenia były tylko trójstanowe.

Również dla osób, które nie mogą znaleźć określonych klas, jeśli nie wszystkie znajdują się w plikach nazwanych tak, jakimi są, czy istnieje powód, dla którego nie używasz Znajdź szukając w całym rozwiązaniu? Korzystanie z funkcji Znajdź oszczędza cenny czas na przewijaniu Eksploratora rozwiązań.


Re: find - kiedy szukam definicji typu, nie chcę widzieć, gdzie jest on używany. Poza tym znajdowanie zajmuje znacznie więcej czasu niż przewijanie uporządkowanej alfabetycznie listy plików, które prawdopodobnie już podzieliłem (według przestrzeni nazw).
Jeff Sternal

1
Zauważyłem, że wskazałeś, że pracujesz z czymś, co podzieliłeś według przestrzeni nazw. Niestety, nie wszyscy mamy szczęście, że zawsze możemy pracować z projektami, którymi byliśmy w stanie zarządzać.
Jason M,

6

Bez względu na to, jak lekka jest zawartość, uważam, że jedna klasa / interfejs / itd. Na plik jest niezbędna.

Jeśli pracuję nad dużym rozwiązaniem w Visual Studio, chcę widzieć pliki i nie muszę zaglądać do środka, aby je zobaczyć. Nawet z narzędziami do nawigacji, takimi jak ReSharper, chcę mapowania 1: 1.

Jeśli znajdziesz wiele plików źródłowych z niewielką ilością lub bez zawartości (być może rozszerzenie klasy, ale nic do niej nie dodając), być może powinieneś przemyśleć swój projekt.


5

Uważam, że grupowanie klasy ze standardową klasą fabryczną w tym samym pliku jest bardzo przydatne.


5

Zwykle miałbym jedną klasę na plik, ale normalnie musiałbyś użyć własnego uznania, aby sprawdzić, czy plik może zawierać powiązane klasy, np. Grupując wyjątki, które mogą być ponownie wykorzystane przez ciebie i innych programistów. W takim przypadku użytkownik potrzebuje tylko jednego pliku, a nie wielu plików.

Chodzi o to, że należy stosować dyskrecję !!!


1
Prawdziwa mądrość, żadna zasada programowania nie jest trudna i szybka.
ChaosPandion,

4

W większych rozwiązaniach uważam, że bardzo cenne jest posiadanie jednej klasy na plik i nadawanie temu plikowi tej samej nazwy co klasie. Znacznie ułatwia zlokalizowanie kodu, w którym musisz pracować.


Uważam ten argument za mniej wartościowy w przypadku narzędzi takich jak ReSharper. Wykonuję CTRL + T i zaczynam wpisywać nazwę typu, którego szukam.
Mark

3
Tak, ale czy chcesz, aby struktura aplikacji była zależna od narzędzia innej firmy?
magnus

1
@magnus Nie mówiłem, że nie jest to powód, aby tego nie robić, ale mniej przekonujący argument dla kogoś, aby to zrobił.
Mark

4

Narzędzie StyleCop dla języka C # ma standardowe reguły, które wymagają nie więcej niż jednej klasy najwyższego poziomu w jednej przestrzeni nazw (plus dowolna liczba interfejsów, delegatów i wyliczeń w tej przestrzeni nazw).

W przypadkach dwóch lub więcej klas, w których druga i kolejne klasy są używane tylko przez pierwszą, te mogą i powinny być klasami wewnętrznymi, widocznymi tylko dla klasy konsumującej.


3
Kiedy mówisz „nie więcej niż jedna klasa najwyższego poziomu w jednej przestrzeni nazw”, masz na myśli w jednym namespacebloku, prawda?
Daniel Pryden,

1
Reguły, o których mowa, to dokument SA1403: AC # może zawierać tylko jedną przestrzeń nazw. SA1402: Dokument AC # może zawierać tylko jedną klasę na poziomie głównym, chyba że wszystkie klasy są częściowe i są tego samego typu.
Steve Gilham,

4

Kiedyś jedna klasa na plik, ale ...

Gdy wiele klas jest ściśle powiązanych, więcej niż jedna klasa w tym samym pliku źródłowym to IMHO, LEPSZE niż poświęcenie krótkiego pliku źródłowego dla każdej klasy. Źródło jest bardziej czytelne i zwarte (a przy użyciu #region to samo źródło może być bardziej uporządkowane niż wcześniej).

Weź również pod uwagę, że czasami NIEZBĘDNE jest rozkładanie tej samej klasy na różne pliki (przy użyciu częściowego ), ponieważ posiadanie pliku źródłowego linii o wielkości 20000+ nie jest przydatne nawet przy dostępnej pamięci RAM (ale to jest inne pytanie).


Oczywiście powinieneś starać się unikać klasy z tak wieloma liniami kodu. Powiedziałbym, że nawet 1000+ robi się za duże. Zdaję sobie również sprawę, że nie zawsze jest to możliwe w starszym kodzie.
Peter

Jeśli spróbujesz wygenerować kod źródłowy (moim przypadkiem jest generowanie wiązania C # dla OpenGL na podstawie jego specyfikacji, z tysiącami punktów wejścia) trudno jest pomyśleć o małej klasie dla dużej ilości danych ...
Luca

3

Czasami zostawiam małą klasę z większą klasą, ale tylko wtedy, gdy są bardzo ściśle powiązane jak przedmiot i jego klasa kolekcji lub fabryka.

Jest z tym jednak jeden problem. W końcu mała klasa rośnie do punktu, w którym powinna znajdować się we własnym pliku, jeśli przeniesiesz ją do nowego pliku, stracisz łatwy dostęp do historii zmian.

to znaczy.

  • w poniedziałek wprowadzam zmiany do moich klas x i y w pliku y.css
  • we wtorek dzielę klasę x na własny plik x.css, ponieważ urósł do dużej wielkości
  • w środę mój szef chce zobaczyć, co zmieniłem w klasie x w poniedziałek, więc przegląda historię x.css, tylko x.css nie pokazuje historii przed zmianami we wtorek.

1
Co jeśli „mała klasa” jest czymś w rodzaju pochodnej EventArgs, która jest przeznaczona do przekazywania informacji odbiorcom wydarzeń z twojej klasy? Czy kod zostałby uczyniony bardziej przejrzystym lub łatwiejszym w utrzymaniu poprzez przeniesienie takiej rzeczy do innego pliku? Można przypuszczać, że taka rzecz powinna być zagnieżdżoną klasą publiczną, ale te też się nie podobają. Jeśli chodzi o historię zmian, czy klasa nie pojawiła się znikąd w dzienniku zmian i czy nie powinien zawierać komentarza w notatce kodowej, skąd pochodzi?
supercat

Sklasyfikowałbym to jako very tightly relatedklasę i zostawiłem, pod warunkiem, że zajmuje ono tylko niewielką ilość miejsca na ekranie i nie jest wykorzystywane do tego samego celu przez żadną inną klasę.
gingerbreadboy

3

Czy to naprawdę problem? :)
Naprawdę małe klasy, podobnie jak wyliczenia, można łączyć z innymi. Należy przestrzegać jednej zasady: łączyć tylko klasy, które mają coś wspólnego.

Jako dygresja - w jednym z moich projektów mam plik zawierający 150 klas. Plik zawiera 10000 linii kodu. Ale jest generowany automatycznie, więc jest w pełni akceptowalny :)


1
Mam ten sam plik ze 120 klasami i 750 podklasami z pół milionem wierszy, jest on również generowany automatycznie. Problem polega na tym: jeśli kliknę na niego, muszę ponownie uruchomić komputer, ponieważ wszystko się zatrzymuje.
Behrooz

3

Jednym z powodów umieszczenia wielu pokrewnych klas w jednym pliku jest to, że biedny drań korzystający z interfejsu API nie musi spędzać pół dnia na wpisywaniu deklaracji importu, a biedny drań, który musi utrzymywać kod, nie musi wydawać połowy dzień przewijany przez szablon deklaracji importowej. Moja ogólna zasada polega na tym, że wiele klas należy do tego samego pliku, jeśli prawie zawsze używasz ich dużego podzbioru w tym samym czasie zamiast tylko jednej.


1
Co rozumiesz przez „płytkę deklaracji importowej”? „Używasz wyciągów”? Ale czy zajęcia nie będą w tej samej przestrzeni nazw?
Joan Venge

3
@Joan: Mam na myśli zaimportowanie 15 różnych, ale powiązanych modułów, aby osiągnąć coś naprawdę prostego. Może to nie dotyczy konkretnie C #. Naprawdę nie znam C #, ale w innych językach jest to dość irytujący problem.
dsimcha

Dzięki tak, dlatego się zdezorientowałem.
Joan Venge

2

Robię to, ale tylko wtedy, gdy klasy są powiązane w sposób potomek-rodzic, a klasy potomne są używane TYLKO przez rodzica.


Dzięki, ale dlaczego nie podzielisz go na inny plik? Po prostu ciekawy.
Joan Venge

@henchman powiedział to o wiele bardziej wymownie niż ja, zwłaszcza gdy obiekt potomny jest bardzo mały. Zwykle jest tak, że klasa
potomna

2

Zwykle trzymam się jednej klasy na plik. Ale zrobię wyjątki dla grup podobnych konstrukcji, które są używane w całym projekcie. Na przykład:

  • EventArgs.cs, który zawiera dowolne EventArgspodklasy, ponieważ zwykle są to tylko 5-10 wierszy kodu, ale zwykle są używane przez kilka różnych klas. Alternatywnie, mogę umieścićEventArgs klasy w tym samym pliku, co klasa, która deklaruje zdarzenia.
  • Plik Delegates.cs, który zawiera Delegatów używanych w całym projekcie, ponieważ zazwyczaj są to tylko 1 linia. Ponownie, alternatywą jest umieszczenie ich w tym samym pliku z klasą, która je udostępnia / zużywa.
  • Enums.cs, który zawiera enums używane w całym projekcie. (Jeśli jest taki, enumktóry jest używany tylko przez jedną klasę, zwykle udam się privatedo tej klasy).

2

Kolejny głos na jedną klasę na plik o nazwie pliku takiej samej jak klasa. Dla mnie pomaga to w długoterminowej konserwacji. Mogę łatwo przejrzeć repozytorium i zobaczyć, które klasy są częścią rozwiązania, bez konieczności otwierania projektu lub dowolnego pliku.


2

Śledzę to w 99% przypadków. Dobrze jest przestrzegać standardów, ale uważam również, że elastyczność ma swoje miejsce. Czasami po prostu wydaje się głupią stratą czasu, aby wszystko rozdzielić. W tych czasach przełamuję się i po prostu piszę swój kod.


2

Dotychczasowe odpowiedzi wydają się obracać wokół wyjątków ludzi od reguły, więc oto moje: trzymam klasy i ich metadane jako „koleżeńskie” klasy razem podczas korzystania z pakietu DataAnnotations w .NET3.5 SP1. W przeciwnym razie są zawsze w osobnych plikach. Wiesz, przez większość czasu. Z wyjątkiem sytuacji, gdy nie są.


2

Robię to rzadko. Na przykład, jeśli istnieje wyliczenie lub struktura, która jest ściśle powiązana z klasą, a jednocześnie zbyt trywialna, aby można ją było samodzielnie rozdzielić.

Lub osobna klasa zawierająca pewne metody rozszerzenia dla tej klasy głównej.


1

One case could be:kiedy wasze klasy razem tworzą taki, module / unitktóry służy niektórym głównym klasom, jak helper classesinne mądre nie .

spójrz na kod źródłowy projektu ASP.NET MVC 2.0 . Ściśle przestrzega tej zasady


1

Podoba mi się pomysł tworzenia mniejszych klas i upewnienia się, że klasa robi tylko to, co powinna. Jeśli masz wiele klas, które przyczyniają się do rozwiązania jednego problemu, połączenie ich w tym samym pliku nie jest szkodliwe.

Nie przestrzegałbym praktyk stwardnienia rozsianego, ponieważ nie są NAJLEPSZYMI PRAKTYKAMI!


1

Inną kwestią, o której nikt inny nie wspomniał, jest to, że kiedy tworzysz regułę jednej klasy na plik, możesz łatwo zobaczyć, czego używa ta konkretna klasa.

Na przykład: możesz mieć dwie klasy, w których jedna klasa używa Linq, a druga nie.

Gdyby te klasy znajdowały się w tym samym pliku, nie byłbyś w stanie stwierdzić bez przejrzenia kodu, która klasa używa czego. Gdy jest to jedna klasa na plik, wystarczy spojrzeć na górę pliku, aby zobaczyć dokładnie, co jest używane w tej klasie. Pomaga, jeśli kiedykolwiek przeprowadzasz migrację do nowej biblioteki itp.


0

Innym powodem, dla którego jedna klasa na plik nie została wymieniona w opublikowanych odpowiedziach jest to, że jedna klasa na plik ułatwia zrozumienie wpływu PR podczas przeglądu kodu. Zmniejsza to także konflikty scalania.

Kiedy ktoś publikuje PR w celu uzyskania opinii, mogę spojrzeć na listę zmienionych plików i od razu zobaczyć, czy nakładają się na to, nad czym mogę pracować. W zależności od nakładania się, mogę chcieć głębiej przyjrzeć się ich kodowi lub dać mu OK, ponieważ jestem pewien, że nie wpłynie to na moje własne zmiany.

Gdy dwie osoby pracują w pliku wieloklasowym i obie dodają zależność, istnieje duża szansa, że ​​wystąpi konflikt scalania w using w górnej bloku . Rozdzielenie klas na pliki oddziela zależności, dzięki czemu można zobaczyć, z czego korzysta każda klasa, i nie ma takich konfliktów.

Istnieją wyjątki od tej reguły (interfejs + implementacja, wyliczenia, ...), ale jest to lepsze miejsce początkowe niż na odwrót, które zazwyczaj pozwala młodym programistom pakować wszystkie niepowiązane klasy w ten sam plik.

Jedna klasa na plik to wyraźna, jednoznaczna zasada niepodlegająca interpretacji.


Powiązane klasy w pliku podlegają osobistym preferencjom i interpretacji (jak widać z wszystkich innych odpowiedzi tutaj, kiedy można używać), a zatem jest to zła zasada.


-1

W przód i w tył było bardzo interesujące i pozornie niejednoznaczne, chociaż mam ogólne wrażenie, że mapowanie 1-1 między klasami i plikami jest większością opinii, choć z pewnymi wyjątkami osobiście.

Jestem ciekawy, czy którakolwiek z twoich odpowiedzi różni się w zależności od tego, czy: (1) tworzysz aplikację Windows Forms, aplikację sieci Web, bibliotekę lub cokolwiek innego; lub (2) przy użyciu programu Visual Studio lub nie. Przy użyciu VS wydaje się, że reguła jednej klasy na plik oznaczałaby również jedną klasę na projekt VS, ponieważ wydaje się, że w innych wątkach koncentracja rozwiązań / projektów VS powinna być dublowana w nazwie i strukturze katalogu / pliku. Rzeczywiście, mam wrażenie, że concensus ma mieć nazwę projektu = nazwa zestawu = (zagnieżdżona) nazwa przestrzeni nazw, z których wszystkie byłyby następnie dublowane w nazwie i strukturze katalogu / pliku. Jeśli są to właściwe wytyczne (lub reguły), wówczas wszystkie te pozornie ortogonalne mechanizmy organizacyjne byłyby jednak zsynchronizowane.


-1

Tak, ze względu na czytelność powinniśmy mieć jeden plik na klasę! Właśnie wskoczyłem do projektu. Widzę wiele klas w jednym pliku. po prostu sprawia, że ​​tak trudno jest nowemu facetowi to zrozumieć. nie powinniśmy myśleć o łatwości konserwacji? kiedy opracowujemy oprogramowanie? wiele razy rozwój będzie kontynuowany przez innych programistów. Mamy przestrzenie nazw, aby uporządkować nasze rzeczy, nie potrzebujemy do tego plików!


-5

Tak, jeden element kodu na plik.

Wszystko inne jest nadużyciem - i, szczerze mówiąc, oznaką ofiary RAD.

Jak tylko rozpocznie się właściwe tworzenie oprogramowania (IoC, wzorce projektowe, DDD, TDD itp.) I pozostawi „omg pozwala to zrobić, nie mam pojęcia jak, ale dostaję wynagrodzenie”, zobaczysz, że ta zasada naprawdę ma znaczenie.

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.