Olen opiskelija, joka liittyi äskettäin ohjelmistokehitysyritykseen harjoittelijana. Yli yliopistossa eräs professoreistani sanoi, että meidän on pyrittävä saavuttamaan ”matala kytkentä ja korkea koheesio”.
Ymmärrän matalan kytkennän merkityksen. Se tarkoittaa erillisten komponenttien koodin pitämistä erikseen, jotta muutos yhdessä paikassa ei rikkoa koodia toisessa.
Mutta mitä tarkoitetaan korkealla yhteenkuuluvuudella. Jos se tarkoittaa saman komponentin eri osien integrointia hyvin keskenään, en ymmärrä, miten siitä tulee hyötyä.
Mitä tarkoitetaan korkealla yhteenkuuluvuudella? Voiko esimerkin selittää ymmärtämään sen edut?
Kommentit
- Mahdollinen kopio Metrics for Koheesio ja kytkentä?
- Eikö wikipedia-artikkeli vastaa kysymykseesi riittävästi? fi.wikipedia.org/wiki/Cohesion_(computer_science)
- Tästä on hyvä artikkeli: msdn.microsoft.com/en-us/magazine/cc947917.aspx
- @EoinCarroll: Valitettavasti wikipedia-artikkeli ei tällä hetkellä anna mitään hyvää konkreettisia esimerkkejä joiden kanssa uudet ohjelmoijat voivat työskennellä. Teoria on hyvä ja kaikki, mutta ei ' ole oikeastaan kiinni, ennen kuin ' olet tehnyt heikkoon yhteenkuuluvuuteen liittyviä virheitä. Korkea yhteenkuuluvuus on yksi niistä aiheista, joka on kestänyt useita vuosia ohjelmoinnin ymmärtämään täysin miksi se on tärkeää ja miten saavuttaa se.
- En ole koskaan ymmärtänyt yhteenkuuluvuutta ennen kuin luin Puhdas koodi. Sinun pitäisi myös.
Vastaa
Yksi tapa tarkastella yhteenkuuluvuutta OO: n suhteen on, jos luokka käyttää mitä tahansa yksityisiä määritteitä. Käyttämällä mittareita, kuten LCOM4 (yhteenkuulumattomien menetelmien puute), kuten gnat huomautti tässä vastauksessa täällä , voit tunnistaa luokat, jotka voidaan korjata uudelleen. Syy, miksi haluat muuttaa menetelmiä tai luokkia yhtenäisemmäksi, on se, että se tekee koodin suunnittelusta muille yksinkertaisemman käyttää sitä . Luota minuun; useimmat tekniset johtajat ja huolto-ohjelmoijat rakastavat sinua, kun korjaat nämä ongelmat.
Voit käyttää rakennusprosessissa työkaluja, kuten kaikuluotain tunnistaa alhainen koheesio koodipohjassa. On olemassa muutama hyvin yleinen tapaus, jotka voin ajatella missä menetelmät ovat vähäisiä ”yhtenäisyydessä” :
Tapaus 1: Menetelmä ei liity lainkaan luokkaan
Harkitse seuraavaa esimerkkiä:
public class Food { private int _foodValue = 10; public void Eat() { _foodValue -= 1; } public void Replenish() { _foodValue += 1; } public void Discharge() { Console.WriteLine("Nnngghhh!"); } }
Yksi menetelmistä , Discharge()
, puuttuu yhteenkuuluvuus, koska se ei kosketa luokan yksityisiä jäseniä. Tässä tapauksessa on vain yksi yksityinen jäsen: _foodValue
. Jos se ei tee mitään luokan sisäisten kanssa, kuuluuko se todella sinne? Menetelmä voitaisiin siirtää toiseen luokkaan, joka voitaisiin nimetä esim. FoodDischarger
.
// Non-cohesive function extracted to another class, which can // be potentially reused in other contexts public FoodDischarger { public void Discharge() { Console.WriteLine("Nnngghhh!"); } }
Kun teet sitä Javascriptissa, koska toiminnot ovat ensimmäisen luokan objekteja, vastuuvapaus voi olla ilmainen toiminto:
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
Tapaus 2: Apuohjelmaluokka
Tämä on itse asiassa yleinen tapaus, joka rikkoo yhteenkuuluvuutta. Kaikki rakastavat hyödyllisyysluokkia, mutta nämä viittaavat yleensä suunnitteluvirheisiin, ja suurimmaksi osaksi niistä koodikannan ylläpitäminen on hankalampaa (koska hyötyluokkiin liittyy suuri riippuvuus). Harkitse seuraavia luokkia:
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; } }
Täältä voimme nähdä, että apuohjelmaluokka tarvitsee käyttää luokan Food
omaisuutta. Hyödyllisyysluokan menetelmillä ei ole tässä tapauksessa lainkaan yhteenkuuluvuutta, koska niiden tekemiseen tarvitaan ulkopuolisia resursseja. Tässä tapauksessa ei olisi parempi, että menetelmät olisivat luokassa, jossa he työskentelevät itsensä kanssa ( kuten ensimmäisessä tapauksessa)?
Tapaus 2b: Piilotetut objektit apuohjelmaluokissa
On toinenkin apuohjelmaluokka, jossa on realisoitumattomia toimialueobjekteja. ohjelmoijan on ohjelmoidessaan merkkijonon manipulointia kirjoittaa sille apuohjelmaluokka.Kuten täällä, joka vahvistaa muutaman yleisen merkkijonon esityksen:
public static class StringUtils { public static bool ValidateZipCode(string zipcode) { // validation logic } public static bool ValidatePhoneNumber(string phoneNumber) { // validation logic } }
Mitä useimmat eivät ymmärrä, että postinumero, puhelinnumero tai mikä tahansa muu merkkijonon repesentointi voi olla itse objekti:
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 } }
Ajatus siitä, että sinun ei pitäisi” käsitellä merkkijonoja ”, on yksityiskohtainen tässä @codemonkeyism -blogiviestissä , mutta liittyy läheisesti koheesioon, koska tapa, jolla ohjelmoijat käyttävät merkkijonoja asettamalla logiikkaa apuohjelmaluokkiin.
Kommentit
- Nyt jos vain saisimme ORM-tiedostomme käsittelemään mukautettuja postinumero- ja puhelinnumeroluokitamme oikein: |
- +1 hyviä esimerkkejä. Viimeinen kohta on myös kohdassa sourcemaking.com/refactoring/primitive-obsession
- @Pete ORM hoitaa sen, jos annat muunnoksen operaattorit merkkijonosta määrittämäsi tyyppiin (postinumero), msdn.microsoft.com/en-us/library/85w54y0a.aspx
vastaus
Korkea yhteenkuuluvuus tarkoittaa samanlaisten ja toisiinsa liittyvien asioiden pitämistä yhdessä, parin liittämistä tai sulauttamista osiin, jotka jakavat sisältöä, toiminnallisuutta, syy tai tavoite . Toisin sanoen matala koheesio voi tarkoittaa esimerkiksi funktiota / luokkaa / koodia, joka palvelee useita tarkoituksia sen sijaan, että se olisi ” siihen pisteeseen ”. Yksi kannettavista ideoista on tehdä yksi asia ja tehdä se hyvin . Toiset voivat sisältää ilmeisen tosiasian, että et toista samanlaista toimintoa monissa paikoissa. Tämä parantaa myös koodipohjan lokalisointia , tietyssä paikassa löytyy tiettyjä asioita (tiedosto, luokka, joukko toimintojen, …) sijaan, että ne olisivat hajallaan.
Tarkastellaan esimerkiksi luokkaa, jolla on kaksi tai kolme tarkoitusta: Lataa / tallentaa resursseja (esimerkiksi tiedoston) ja analysoi ja näyttää sitten Tällaisella luokalla on heikko yhteenkuuluvuus, koska se hallinnoi vähintään kahta erillistä tehtävää, jotka eivät liity lainkaan (tiedoston I / O, analyysi ja näyttö). Korkean yhteenkuuluvuuden suunnittelussa voitaisiin käyttää erillisiä luokkia resurssin lataamiseen ja tallentamiseen, analysointiin ja sitten esittämiseen.
Toisaalta matalan kytkennän tarkoituksena on pitää erilliset asiat erillään – niin, että ne ovat vuorovaikutuksessa toistensa kanssa. mahdollisimman vähän, mikä vähentää monimutkaisuutta ja yksinkertaistaa suunnittelua.
Vastaus
Se tarkoittaa, että objektin osat liittyvät läheisesti objektin toimintaan. Tämä tarkoittaa, että esineessä on hyvin vähän tai ei ollenkaan jätettä toiminnan tai vastuun suhteen. Tämä puolestaan voi parantaa ymmärrystä siitä, mihin kyseistä objektia on tarkoitus käyttää.
Kommentit
- ei ' e sitä sovelletaan myös korkeammalle tasolle kuin vain esineille? esim. tehtävään liittyvien objektien / funktioiden ryhmittely nimiavaruuksiin?