Jsem student, který se nedávno stal stážistkou ve společnosti zabývající se vývojem softwaru. Již na univerzitě jeden z mých profesorů říkal, že musíme usilovat o dosažení „nízké vazby a vysoké soudržnosti“.
Chápu význam nízké vazby. Znamená to uchovávat kód samostatných komponent zvlášť, aby změna na jednom místě nezlomila kód na jiném.
Ale co se rozumí vysokou soudržností. Pokud to znamená vzájemnou integraci různých částí stejné součásti, nerozumím tomu, jak se to stává výhodným.
Co je míněno vysokou soudržností? Lze vysvětlit příklad, aby pochopil jeho výhody?
Komentáře
- možný duplikát Existují Metriky pro soudržnost a propojení?
- Neodpovídá článek wikipedie dostatečně na vaši otázku? en.wikipedia.org/wiki/Cohesion_(computer_science)
- Dobrý článek o tom najdete na: msdn.microsoft.com/en-us/magazine/cc947917.aspx
- @EoinCarroll: Bohužel článek o wikipedii v současné době nedává nic dobrého konkrétní příklady s nimiž mohou noví programátoři pracovat. Teorie je dobrá a vše, ale ' se opravdu nedrží, dokud ' neuděláte chyby kolem nízké soudržnosti. Vysoká soudržnost je jedním z témat, která mi zabrala několik let programování, abych plně pochopil, proč je to důležité a jak to dosáhnout.
- Soudržnosti jsem nikdy nerozuměl, dokud jsem si nepřečetl Čistý kód. Měli byste také.
Odpovědět
Jedním ze způsobů pohledu na soudržnost z hlediska OO je, pokud metody v třída používá některý ze soukromých atributů. Pomocí metrik, jako je LCOM4 (Nedostatek soudržných metod), jak uvádí gnat v této odpovědi zde , můžete identifikovat třídy, které lze refaktorovat. Důvodem, proč chcete refaktorovat metody nebo třídy, aby byly soudržnější, je to, že zjednodušuje návrh kódu pro ostatní, aby jej mohli používat . Věř mi; většina technologických potenciálních zákazníků a programátorů údržby vás bude při řešení těchto problémů milovat.
Ve svém procesu sestavování můžete použít nástroje, například Sonar pro identifikovat nízkou soudržnost v kódové základně. Existuje několik velmi běžných případů, které mě napadají, kde metody mají nízkou „soudržnost“ :
Případ 1: Metoda vůbec nesouvisí s třídou
Zvažte následující příklad:
public class Food { private int _foodValue = 10; public void Eat() { _foodValue -= 1; } public void Replenish() { _foodValue += 1; } public void Discharge() { Console.WriteLine("Nnngghhh!"); } }
Jedna z metod Discharge()
postrádá soudržnost, protože se nedotýká žádného ze soukromých členů třídy. V tomto případě existuje pouze jeden soukromý člen: _foodValue
. Pokud s vnitřními prvky třídy nic nedělá, pak tam opravdu patří? Metodu lze přesunout do jiné třídy, kterou lze pojmenovat, např. FoodDischarger
.
// Non-cohesive function extracted to another class, which can // be potentially reused in other contexts public FoodDischarger { public void Discharge() { Console.WriteLine("Nnngghhh!"); } }
Děláte to v Javascriptu, protože funkce jsou prvotřídní objekty, výboj může být bezplatná funkce:
function Food() { this._foodValue = 10; } Food.prototype.eat = function() { this._foodValue -= 1; }; Food.prototype.replenish = function() { this._foodValue += 1; }; // This Food.prototype.discharge = function() { console.log("Nnngghhh!"); }; // can easily be refactored to: var discharge = function() { console.log("Nnngghhh!"); }; // making it easily reusable without creating a class
Případ 2: Utility Class
Toto je ve skutečnosti běžný případ, který narušuje soudržnost. Každý miluje třídy nástrojů, ale ty obvykle označují nedostatky v designu a většinu času ztěžují údržbu kódové základny (kvůli vysoké závislosti spojené s třídami nástrojů). Zvažte následující třídy:
public class Food { public int FoodValue { get; set; } } public static class FoodHelper { public static void EatFood(Food food) { food.FoodValue -= 1; } public static void ReplenishFood(Food food) { food.FoodValue += 1; } }
Zde vidíme, že třída nástrojů potřebuje pro přístup k vlastnosti ve třídě Food
. Metody ve třídě nástrojů nemají v tomto případě vůbec žádnou soudržnost, protože k tomu potřebují vnější zdroje. V tomto případě by nebylo lepší mít metody ve třídě, se kterou pracují samy ( podobně jako v prvním případě)?
Případ 2b: Skryté objekty ve třídách nástrojů
Existuje další případ tříd nástrojů, kde existují nerealizované objekty domény. První reakce na kolena programátor má při programování manipulace s řetězcem napsat pro něj třídu nástrojů.Stejně jako ten, který ověřuje několik běžných řetězcových reprezentací:
public static class StringUtils { public static bool ValidateZipCode(string zipcode) { // validation logic } public static bool ValidatePhoneNumber(string phoneNumber) { // validation logic } }
Co Zde si většinou neuvědomujeme, že poštovní směrovací číslo, telefonní číslo nebo jakákoli jiná reprezentace řetězce může být samotný objekt:
public class ZipCode { private string _zipCode; public bool Validates() { // validation logic for _zipCode } } public class PhoneNumber { private string _phoneNumber; public bool Validates() { // validation logic for _phoneNumber } }
Představa, že byste neměli“ zpracovávat řetězce „, je podrobně uvedena v tomto příspěvku na blogu od @codemonkeyism , ale úzce souvisí s soudržností, protože způsob, jakým programátoři používají řetězce tím, že vkládají logiku do tříd nástrojů.
Komentáře
- Nyní, kdybychom mohli získat naše ORM správně zpracovat naše vlastní třídy ZipCode a PhoneNumber: |
- +1 dobré příklady. Pokud jde o poslední bod, viz také sourcemaking.com/refactoring/primitive-obsession
- @Pete Vaše ORM to zvládne, pokud poskytnete konverzi operátory z řetězce do definovaného typu (ZipCode, PhoneNumber): msdn.microsoft.com/en-us/library/85w54y0a.aspx
Odpověď
Vysoká soudržnost znamená udržovat podobné a související věci pohromadě, spojovat nebo spojovat části, které sdílejí obsah, funkčnost, důvod nebo cíl . Jinými slovy, nízká soudržnost může například znamenat entitu funkce / třídy / kódu, která slouží spíše pro více účelů než jako „ k bodu “. Jedním z nosných nápadů je udělat jednu věc a udělat to dobře . Jiné by mohly zahrnovat zřejmý fakt, že na mnoha místech nereplikujete podobné funkce. To také zlepšuje lokalitu základny kódu, určité věci se nacházejí na určitém místě (soubor, třída, sada funkcí, …), než aby byly rozptýleny.
Jako příklad zvažte třídu, která slouží dvěma nebo třem účelům: Načte / uloží zdroje (například soubor) a poté analyzuje a zobrazí obsah. Taková třída má nízkou soudržnost, protože zvládá alespoň dva samostatné úkoly, které vůbec nesouvisejí (vstupně-výstupní soubory, analýza a zobrazení). Návrh s vysokou soudržností by mohl použít odlišné třídy pro načtení a uložení zdroje, jeho analýzu a následné zobrazení.
Na druhou stranu, nízká vazba si klade za cíl udržet oddělené věci oddělené – tak, aby na sebe vzájemně působily co nejméně, což pak snižuje složitost a zjednodušuje design.
Odpověď
Znamená to, že části objektu úzce souvisí s funkcí objektu. To znamená, že v objektu je velmi málo nebo žádný odpad z hlediska funkce nebo odpovědnosti. To zase může zlepšit pochopení toho, k čemu se má daný objekt použít.
Komentáře
- does ' Platí to i pro vyšší úroveň než jen pro objekty? např. seskupování objektů / funkcí souvisejících s úkolem v jmenných prostorech?