Óvatosan, valódi szerződések osztályok eltérhetnek formális

Óvatosan, valódi szerződések osztályok eltérhetnek formális 8

  • 24.11.15 01:35 •
  • FiresShadow •
  • • # 271533
  • • Habrahabr
  • 16 •
  • 7600

- mint a Forbes, csak jobb.

Röviden, ebben a cikkben fogunk összpontosítani a szabály öröklési Liska, a különbség NotifyCollectionChangedAction.Reset szerződések változatai .NET-keretrendszer 4 és a .NET-keretrendszer 4.5. és amely körül a két szerződés, az igaz, és mi - téves.



Elve alapján Liski. származtatott osztály egy alap osztály örökli a szerződés (azzal a lehetőséggel, hozzátéve, hogy a specificitása nem ellentmondó, az eredeti szerződés).

Itt egy példa. Képzeljük el, hogy az eljárás Add List-és a virtuális. Ha létre az utódja a listáról<>, A Hozzáadás mód hozzá kell tenni, hogy a gyűjtemény egyetlen elem. Ha az elem lesz hozzá csak bizonyos feltételek mellett, vagy hozzá kell adni az elem és az ennek megfelelő, az egyedi kódot, amely elvárja, hogy a hívás után hozzáadása száma növekszik, pontosan egy használhatatlanná válik. Viselkedés leszármazott osztályokban kell számítani a kódot, amely egy változó alaptípus.

Most képzeljük el, hogy fogsz használni a kódot List<>. Ítélve a név hozzáadása és paraméterek (egyetlen elem), a módszer, hogy egy elemet a gyűjtemény. Már csak használni a lapot, és biztosak vagyunk benne, hogy így is van. Akkor kérje kollégák, és nem habozott, hogy erősítse meg, hogy ez így van. De nézzük egy pillanatra képzeljük el, hogy megy az MSDN, olvassa el a dokumentációt, és azt mondja, hogy az Add csak „változtatni az eredeti gyűjtemény”, azaz Úgy csinál semmit. Ebben az esetben hívjuk a szerződés, ami jellemző az az alap osztály, és amelyen minden támaszkodnak, igaz. és az egyik, hogy a dokumentációban leírt - formális.

Amikor létrehoz egy osztály örökös, akkor támaszkodnak a hivatalos viselkedés, mint valódi, hivatalosan akkor nem törik semmi, de valójában létre egy bomba, hogy valaha is létrehozhat, hogy valaki (talán nem neked) problémákat.

Példa különbségek és a hivatalos szerződés igaz - NotifyCollectionChangedAction.Reset. Előtt 4.5 verzió visszaállítása azt jelentette, hogy a tartalmát a gyűjtemény drámaian megváltozott. Ami azt jelenti, „erős”? Mert valaki, aki a három elem a nagy változás, és valakinek nem.

Általában reset jelentette „gyűjtemény változott, ahogy tetszik.” Kezdve 4.5 verzió visszaállítása jutott jelenti a gyűjtemény a tisztítás. Néhányan talán úgy gondolja, hogy ez a változás történt hiába, mert tör visszafelé kompatibilitás, de azt mondanám, hogy jól sikerült a srácok - vették észre időben, hogy a valódi esélye a hivatalos szerződés, és azonnal korrigálni a hibát. Segítségével ObservableCollection, akkor felel visszaállítása, csak akkor, ha a Clear módszert hívták egy objektum (). Programozók, akik rendszeresen egy ObservableCollection, megszoktam, és úgy vélik, hogy a norma. „Amikor találkozhatnak visszaállítása», - kérje meg őket, és ők nem habozott válaszolni: „Amikor elhívtak Tiszta!». Természetesen ők ösztönösen érzi, hogy ez a magatartás, amely vált de facto szabvány, fenn kell tartani, és utódai. Ezért a dokumentáció kell mondani, hogy a Reset - jel gyűjtemény razzia.

Összefoglalva: ha végre örökös támaszkodik a legkonkrétabb és egyedi szerződést, beleértve a formális és igaz. Ha ön használ osztály, támaszkodva a legkevésbé konkrét szerződés, ideértve a hivatalos és igaz.

A visszaállítás úgy vélik, hogy ez jelent semmit. Örökli egy ObservableCollection, úgy vélik, hogy reset tiszta gyűjtemény.

Ui Ha érdekel a véleményem a Reset, úgy vélem, hogy a ObservableCollection osztály fejlesztők kell hagyni a Reset-és a szerződés abban a formában, amelyben ma (jele gyűjtemény tisztítás), de hozzá az átviteli elem, jelezve, hogy gyűjtemény változott, ahogy tetszik, és ami nem lehet használni az eredeti ObservableCollection. Az a tény, hogy csak egy átadóelem, jelezve, hogy a megváltozott több eleme a gyűjtemény - Reset, a fennmaradó elemeit az átutalás jelzi, hogy változás az egyetlen elem. Egy nap, annak érdekében, hogy elfogadható teljesítményt, az egyik programozó kellett először változtatni néhány elem van a gyűjteményben, majd küldje el pontosan egy jel, hogy módosítsa a gyűjtemény. És nem volt más választása, mint hogy jelezze a változás a gyűjtemény utódja származó ObservableCollection reset-, és hiányoznak azok az egyéb alternatívák.

Tehát úgy gondolom, hogy a változás dokumentáció megoldani egy problémát, de ugyanakkor létrehozott egy másik (amelyekre megoldást kell hozzá még egy eleme az átutalás). Ez vicces, de néha nem használt lekötött elemek javára.

Általában NotifyCollectionChangedEventArgs tartalmaz NewItems tulajdonságok és OldItems, amely tartalmazhat egy vagy több objektumot. Azzal az egyetlen eleme a felsorolás, jelezve, hogy a megváltozott több elemből gyűjtemény - visszaállítás nem általánosan igaz. Hozzáadása és eltávolítása csak jelezheti több változás. És ez egy valódi szerződést és MSDN Set hivatalos: hogy ezek az intézkedések csak az egyik eleme.

A gyakorlatban azonban részeként .Net Framework egyetlen alkatrész, ami jól működik (NewItems.Count> 1) és (OldItems.Count> 1). A legjobb, kivételt dobnak, és a legrosszabb esetben - az összes elemet az első kivételével egyszerűen figyelmen kívül hagyja.

Ez nem azt jelenti, hogy ezt a funkciót nem tudom használni a saját komponenseket, nem? Mivel ezek a tulajdonságok vannak, és azok helyesen kitöltve, ha létre egy példány NotifyCollectionChangedEventArgs osztály, egy ilyen lehetőség egyértelműen tervezett.

Hozzáadása és eltávolítása csak jelezheti több változás.
Munka ObserverableCollection, van gyakorolni legalább egyszer szembesül egy ilyen esetben? Tudna egy példát, kérem?
Nincs módszer ObserverableCollection AddRange. Minden alkalommal, amikor az eljárás hozzáadása (ami paraméterként egy elem) kiváltó esemény, ami NewItems mindig pontosan egy elemet. Tehát NotifyCollectionChangedAction.Add mi van írva MSDN igaz a gyakorlatban.

Azt könnyen örökölt ObservableCollection<> és adjunk hozzá AddRange módszer, és még RemoveRange, hogy mit csinálok a gyakorlatban, és ha szükség van rá. Ezen kívül, azt is észreveszi, hogy a gyűjtemény (pl ObservableHashSet<>) Használata INotifyCollectionChanged interfész. Ebben a kiviteli alakban, azonos módon lehet AddRange módszerek és RemoveRange. elvileg adni a kódot, vagy üzenet világos?

A fenti cikk tanácsot a választás a két szerződés lényeges függetlenül attól, hogy a szerződés intuitív elvárások, vagy mindkettő szerződések formai. Ismét, ha végre az örökös, alapja a legtöbb konkrét és egyedi szerződés kettő között.
A hivatalos szerződés a .NET-keretrendszer 4 mondja hozzáadása eszköz «Egy vagy több elem adunk a gyűjtemény.». A hivatalos szerződés a .NET-keretrendszer 4.5 Felvétel - «Egy elemet hozzá a gyűjteményhez.».
Ezzel, ahogy mondod, akkor megtörje a nyilvánosság hivatalos szerződést 4.5 verzió.
Szerződésszegés, amely intuitív bizalom - a téma vékony és holivarnaya, de ez sérti a hivatalos szerződés - vitathatatlan tény. Azt javasoljuk, hogy használja az öröklési szerződést a legnagyobb megszorítások - azaz Emellett egyetlen elem, használat közben - a legkevésbé korlátozó, azaz Emellett több elemből.

teljesítmény hozta le (-1)
de legalizált kreatív fejlesztők, akik nem tudnak olvasni a specifikáció (100500)
Egyetértek, én csak azt írta, hogy
Tehát úgy gondolom, hogy a változás dokumentáció megoldani egy problémát, de ugyanakkor létrehozott egy másik (amelyekre megoldást kell hozzá még egy elem a felsorolás)

És minden probléma nem az a fajta „valódi szerződés”, de a régi hibákat a végrehajtás.
Mindenesetre tisztázatlan helyzet, a legegyszerűbb módja annak, hogy ne habozzon, hogy hibás a teljes end-előadók. Azonban nézzük meg, hogy miért az utolsó előadók megvalósított „szabályozza a görbék az ellátás WPF» így? Talán megbotránkoznak az egész világ szadistákat, szándékosan hibázott? Hülyén hangzik. És talán az intuitív elvárások a viselkedését ObservableCollection különbözik attól, amit írt MSDN. Úgy hangzik hihető. Szóval, van egy kis probléma - intuitív elvárások a legtöbb fejlesztő nem egyezik a leírás a dokumentációban. Mi is lehetne a megoldás? Nos, a legegyszerűbb módja annak, hogy ne habozzon, hogy helyezze a felelősséget a probléma megoldásának az utolsó előadók. Mint, fiúk, memorizálni fejből minden MSDN és ismételd meg rendszeresen. Ez segít megszabadulni a hibákat? Nem hiszem, hogy ez segíteni fog. Második lehetőség -, hogy intuitív elvárások a legtöbb programozó egyezik a leírás a dokumentációban. Ez hogyan értékeli a helyzet a változások a dokumentációt. Ha van építő kritika - Örülnék, hogy valaki másnak a véleményét. Az a kifejezés, hogy „az összes fenti nonszensz, hogy hibás a végső előadóművészek, szar hibák” nem nagyon hasonlít az építő jellegű kritikát, mert nem hozta nyilvánosságra egy gondolat, de miért nonszensz, hogy miért „minden probléma nem az a fajta” valódi szerződés „”

Meg fogom magyarázni egy kicsit. A .NET-keretrendszer 4 azt mondja, hogy adja azt jelenti, hogy egy vagy több elemet hozzá a gyűjteményhez, és a fejlesztők, nyilván irányított intuitív elvárások alakult ObservableCollection, ami azt jelenti, hozzáadunk egy Felvétel elemet. És ha a dokumentáció elhangzott, hogy az Add hozzáadását jelenti az egyik eleme, akkor senki sem próbálta eladni a gyűjtemény oly módon, hogy az Add további elemek, és nem kell szembenézni a problémákkal. További jó lenne, hogy meghatározza a dokumentációt Reset tisztítás gyűjtemény, és adjunk hozzá egy elem, amely jelzi egy tetszőleges változás a gyűjtemény. Egybeesés intuitív elvárások és formai követelményeknek csökkenti a hibák valószínűségét. Ebben az esetben úgy tűnik, a hivatalos dokumentáció írták absztrakt felületet, és intuitív elvárások alapján kialakított egy adott osztályban.

További jó lenne, hogy meghatározza a dokumentációt Reset tisztítás gyűjtemény, és adjunk hozzá egy elem, amely jelzi egy tetszőleges változás a gyűjtemény.
Egyre rosszabb. Hozzáadása elemet egy nyilvános enum törés visszafelé kompatibilisek a kódot közvetlenül.
És ha a dokumentáció elhangzott, hogy az Add hozzáadását jelenti az egyik eleme, akkor senki sem próbálta eladni a gyűjtemény oly módon, hogy az Add további elemek, és nem kell szembenézni a problémákkal.
„Intuitív fejlesztők” akkor is írt a saját, nem olvassa el a dokumentációt definíció szerint.

Nem számít - az eredmény a fontos.
És ha az ok nem fontos, hogy a földön, hogy tanuljunk a hibákat mások? Hogy, hogy nem elkövetni ugyanazokat a hibákat a jövőben? Egyik célja cikkem - figyelmezteti az olvasók ezen hibák ellen. Ha mindez nem számít - nos, a jobb oldalon, akkor továbbra is figyelmen kívül hagyja az intuitív elvárások a fejlesztők, az továbbra is a lelkiismerete.
Tulajdonképpen a kérdésem az volt, miért mondja, hogy „minden a problémák nem az a fajta” valódi szerződés „”, és válaszul hallottam egy csomó érzelmek megsértése visszafelé kompatibilitás és a WPF fejlesztők kompetencia felmérések. Ön minden bizonnyal teljes joggal érzelmek, és ennek köszönhetően az általuk megosztott, de a vita téma érdemi lenne sokkal kellemesebb és hasznosabb.

„Intuitív fejlesztők” akkor is írt a saját, nem olvassa el a dokumentációt definíció szerint. Intuitív elvárások nem alakult véletlenszerűen, hanem viselkedése alapján egy adott osztályban. Azt hittem, hogy meglehetősen részletes leírása megtalálható ebben a folyamatban, még két példát említi. Azt hiszem, van egy szabályos trollok. Az utolsó cikk, amit már 5 alkalommal kérdezték memóriavesztés és gyenge események, és én csak azt mondta 5: [1]. [2]. [3]. [4]. [5]. Ebben a cikkben minden a feje tetejére próbálva.

Nos, ha az a tény, hogy nem lenne különbség a intuitív elvárások és szükséges dokumentáció vagy osztályokat az interfészt megvalósító hozzá módszerekkel AddRange, RemoveRange, vagy megint írni dokumentumokat lehet adni csak az egyik eleme.