it-swarm-eu.dev

Více tříd v jednom souboru .cs - dobré nebo špatné?

Je vhodné vytvořit více tříd v souboru .cs nebo by měl mít každý soubor .cs samostatnou třídu?

Například:

public class Items
{
    public class Animal
    {
    }

    public class Person
    {
    }

    public class Object
    {
    }
}

Chvíli se vyhýbáte skutečnosti, že se jedná o špatný příklad dobré architektury, má více než jedna třída v souboru CSC vůni kódu?

29
Sergio

Příklad, který jste uvedl, je podle mého názoru skutečně v pořádku. Vyhlašujete vnitřní třídy, takže je naprosto rozumné ponechat je v stejném soubor. Jediným způsobem, jak to obejít, by bylo, aby vaše třída Items byla částečnou třídou a rozdělila ji na více souborů. Zvážil bych tuto špatnou praxi. Moje obecná politika pro vnořené třídy je, že by měly být malé a soukromé. Existují dvě výjimky:

  • navrhujete klastr třídy (běžnější v cíli c), proto může být rozumné použít přístup částečné třídy
  • potřebujete výčet, který se používá pouze s veřejným API nadřazené třídy. V tomto případě dávám přednost tomu, aby byl veřejný výčet deklarován uvnitř nadřazené třídy místo znečišťování mého jmenného prostoru. Výčet, který je „vnitřním výčtem“, má za následek, že mu dává přesně definovaný rozsah.

Pokud otázku položíte trochu jinak a zeptáte se: „Mám-li vložit každou třídu jmenného prostoru - úroveň do svého vlastního souboru“, pak by moje odpověď byla „ano“.

Při navrhování tříd respektujeme zásadu Single Responsibility Principle. Čtení kódu se stává mnohem jednodušší, pokud jeho tvar sleduje jeho sémantiku, takže rozdělení souborů podle třídy je rozumné.

Z mechanického hlediska má mít soubor ve třídě několik výhod. V různých oknech můžete otevřít více tříd současně. To je zvláště důležité, protože žádný vážný vývojář nepracuje s méně než dvěma obrazovkami. Být schopen mít více kontextů v přední mé hlavě znamená, že mohu udržet více kontextů v mé hlavě. (Většina IDE vám umožní otevřít stejný soubor dvakrát, ale považuji to za trapné).

Dalším důležitým aspektem je řízení zdroje a slučování. Udržováním svých tříd oddělených se vyhnete mnoha problémům při provádění změn ve stejném souboru, protože je třeba změnit samostatné třídy.

30
Johannes Rudolph

Chcete-li být brutálně upřímní, do souboru nepřidávejte více než jednu kořenovou třídu. Při mé poslední práci existovaly soubory nejen s více třídami, ale s více jmennými prostory, a to se táhlo do několika tisíců řádků kódu. Velmi obtížné sledovat.

Pokud existují třídy, které spolu úzce souvisejí, pak buď pojmenujte své soubory podobně, nebo je vložte do podsložky.

Fyzické oddělení souborů třídy pomáhá (poznámka, nikoli konec všeho), vyvolává oddělení obav a volnější spojení.

Na druhé straně váš příklad nezobrazuje více než jednu kořenovou třídu. Existuje několik vnořených tříd (poznámka: zkuste nevyrábět vnořené třídy nic jiného než private, pokud to můžete navrhnout) a toto je naprosto v pořádk mít v jednom souboru.

11
Jesse C. Slicer

Jednoduše řečeno ano, není to dobrý způsob, jak to udělat, a já vám řeknu proč, o něco později, až bude vaše řešení velké, zapomenete, kde jsou třídy, protože název souboru již nebude představovat, co je obsah, jaký je název souboru AnimalPersonObject.cs to prostě není možné.

Jistě se můžete obejít pomocí funkcí v nástrojích, jako je resharper pro přechod na typy, ale 1 třída na soubor (včetně rozhraní) je opravdu páteří jakéhokoli standardu kódu, který jsem kdy viděl, nejen v .net, ale v Java a c ++ a spousta dalších jazyků, těch, které často nemají problémy s údržbou, a zjistíte, že juniorské devs je těžké pochopit kód.

Téměř všechny nástroje pro optimalizaci kódu vám řeknou, abyste přesunuli třídy do samostatného souboru, takže pro mě ano je to vůně kódu a je třeba ji nějak neutralizovat :)

7
krystan honour

Pokud jsou soubory vysoce soudržné, například pokud je to alternativa k několika velmi krátkým, podobně pojmenovaným souborům, může to být dobrý nápad.

Například zjistím, že při používání Fluent NHibernate je to jednodušší, pokud si ponechám Entity a EntityMap v jediném souboru, navzdory tomu, co o tom moje nástroje mohou říci.

Ve většině případů je vyhledávání obtížnější. Používejte opatrně a opatrně.

7
mootinator

Dalším problémem je, že s velmi velkými a podobnými třídami ve stejném souboru - když nemůžete viz deklaraci třídy za všech okolností - můžete skončit tím, že do nesprávné třídy umístíte body přerušení a přemýšlíte, proč Nenechám se zasáhnout ... grrr! :)

3
Julia Hayward