Zárt . Ennek a kérdésnek jobban kell összpontosítania . Jelenleg nem fogadja el a válaszokat.

Megjegyzések

  • Úgy tűnik, hogy MainMa és én másképp definiáljuk a " zászlót. " Az #ifdefs előfeldolgozóra gondoltam. Melyiket kérdezte?
  • Ez nagyon jó kérdés. ' Magam is sokat gondolkodtam ezen, és azon kaptam magam, hogy azt mondom, hogy " jaj, csak egy zászlót használhatok " egy kicsit túl sok.
  • A logikai értékek zászlók. (Így vannak az egész számok, így a …)
  • @KarlBielefeldt Úgy gondolom, hogy az OP olyan logikai vagy egész változókra utal, amelyekhez bizonyos helyeken értéket rendel, majd lent lent bejelöli, majd orther-be tenni valamit, vagy nem, mint például a newItem = true használatával, akkor néhány sor if (newItem ) then
  • alatt vegye figyelembe a bevezeti a változó refaktorálásának magyarázatát ebben az összefüggésben. Mindaddig, amíg a módszer rövid marad és alacsony az útvonalak száma, ezt érvényes használatnak tartom.

Válasz

Az a probléma, amelyet a zászlókat használó kód karbantartásakor láttam, az, hogy az államok száma gyorsan növekszik, és szinte mindig vannak kezeletlen állapotok. Egy példa saját tapasztalatomból: egy olyan kódon dolgoztam, amelyen ez a három zászló volt.

bool capturing, processing, sending; 

Ez a három nyolc állapotot hozott létre (valójában két másik zászló is volt is). A kód nem fedte le az összes lehetséges értékkombinációt, és a felhasználók hibákat láttak:

if(capturing && sending){ // we must be processing as well ... } 

Kiderült, hogy vannak olyan helyzetek, amikor az if utasítás feltételezése A fenti adatok hamisak voltak.

A zászlók idővel összetűnnek, és elrejtik az osztály tényleges állapotát. Ezért kerülni kell őket.

Megjegyzések

  • +1, " kerülni kell ". Hozzátennék valamit a következővel kapcsolatban: ', de a zászlókra bizonyos helyzetekben szükség van ' (egyesek szerint ' szükséges gonosz ')
  • @TrevorBoydSmith Tapasztalataim szerint nem azok, csak valamivel többre van szükséged, mint az átlagos agyi erő, amire használnád egy zászló
  • Példájában egyetlen állapotot kellett volna képviselnie, nem pedig 3 logikai értéket.
  • Hasonló problémához juthat, mint amit én ' m most néz szembe. Az összes lehetséges állapot lefedése mellett két alkalmazás ugyanazt a jelzőt használhatja (pl. Ügyféladatok feltöltése). Ebben az esetben csak egy feltöltő fogja használni a jelzőt, kapcsolja be, és sok sikert talál a jövőben.

Válasz

Itt egy példa, amikor a zászlók hasznosak.

Van egy kódrészletem, amely jelszavakat generál (kriptográfiailag biztonságos álvéletlenszám-generátor használatával). A metódus hívója választja, hogy A jelszónak nem szabad tartalmaznia nagybetűket, apró betűket, számjegyeket, alapvető szimbólumokat, kiterjesztett szimbólumokat, görög szimbólumokat, cirill betűket és unicode-ot.

Zászlókkal a módszer egyszerű meghívása:

 var password = this.PasswordGenerator.Generate( CharacterSet.Digits | CharacterSet.LowercaseLetters | CharacterSet.UppercaseLetters);  

és leegyszerűsíthető is:

 var password = this.PasswordGenerator.Generate(CharacterSet.LettersAndDigits);  

Zászlók nélkül mi lenne a módszer aláírása?

 public byte[] Generate( bool uppercaseLetters, bool lowercaseLetters, bool digits, bool basicSymbols, bool extendedSymbols, bool greekLetters, bool cyrillicLetters, bool unicode);  

így hívták:

 // Very readable, isn"t it? // Tell me just by looking at this code what symbols do I want to be included? var password = this.PasswordGenerator.Generate( true, true, true, false, false, false, false, false);  

Amint azt a megjegyzések megjegyezték, egy másik megközelítés egy gyűjtemény használata lenne:

 var password = this.PasswordGenerator.Generate( new [] { CharacterSet.Digits, CharacterSet.LowercaseLetters, CharacterSet.UppercaseLetters, });  

Ez sokkal olvashatóbb a true és false, de ennek ellenére két hátránya van:

A fő hátrány az, hogy kombinált értékek, például CharacterSet.LettersAndDigits ilyesmit írna a Generate() módszerrel:

 if (set.Contains(CharacterSet.LowercaseLetters) || set.Contains(CharacterSet.Letters) || set.Contains(CharacterSet.LettersAndDigits) || set.Contains(CharacterSet.Default) || set.Contains(CharacterSet.All)) { // The password should contain lowercase letters. }  

valószínűleg így írt át:

 var lowercaseGroups = new [] { CharacterSet.LowercaseLetters, CharacterSet.Letters, CharacterSet.LettersAndDigits, CharacterSet.Default, CharacterSet.All, }; if (lowercaseGroups.Any(s => set.Contains(s))) { // The password should contain lowercase letters. }  

Hasonlítsa össze ezt a meglévőkkel a zászlók használatával:

 if (set & CharacterSet.LowercaseLetters == CharacterSet.LowercaseLetters) { // The password should contain lowercase letters. }  

s econd, nagyon kicsi hátránya, hogy nem világos, hogyan viselkedne a módszer, ha így hívják:

 var password = this.PasswordGenerator.Generate( new [] { CharacterSet.Digits, CharacterSet.LettersAndDigits, // So digits are requested two times. });  

Megjegyzések

  • Úgy gondolom, hogy az OP olyan logikai vagy egész változókra utal, amelyekhez bizonyos helyeken értéket rendel, majd lent lent ellenőriz, majd orther tenni valamit, vagy nem, például például a newItem = true használatával, majd néhány sor alatt if (newItem ) then
  • @MainMa Nyilván ott ' sa 3rd: A 8 logikai argumentummal bíró verzióra gondoltam, amikor " zászlókat " …
  • Sajnáljuk, de az IMHO ez a tökéletes eset a módszer láncolásához ( hu.wikipedia.org/wiki/Method_chaining), Ezenkívül használhat egy paraméter tömböt (asszociatív tömbnek vagy térképnek kell lennie), ahol az adott paraméter tömbben megadott bármely bejegyzés az alapértelmezett érték viselkedést használja ahhoz a paraméterhez. Végül a metódus-láncolással vagy a paramétertömbökkel történő hívás ugyanolyan tömör és kifejező lehet, mint a bitjelzők, továbbá nem minden nyelv rendelkezik bitoperátorokkal (valójában szeretem a bináris jelzőket, de az imént említett módszereket használnám helyette). / li>
  • Ez ' nem túl OOP, igaz? <

d készítettem egy felületet ala: String myNewPassword = makePassword (randomComposeSupplier (new RandomLowerCaseSupplier (), new RandomUpperCaseSupplier (), new RandomNumberSupplier)); a String makePassword használatával (Szállító < Karakter > charSupplier); és szállító < Karakter > randomComposeSupplier (Szállító < Karakter > … beszállítók); Most újból felhasználhatja beszállítóit más feladatokhoz, tetszés szerint összeállíthatja őket, és egyszerűsítheti a GenerPassword metódust, így minimális állapotot használ.

  • @Dibbeke Beszéljen egy főnevek királysága
  • Válasz

    Hatalmas funkcióblokk a szaga , nem a zászlók. Ha az 5. sorban állítja be a jelzőt, akkor csak a 354. sorban ellenőrizze, hogy ez rossz-e. Ha rosszul állítja be a 8. sort, és a 10. sorban található, akkor ez rendben van. Ezenkívül egy kódblokkonként egy vagy két zászló rendben van, a függvényekben 300 zászló rossz.

    Válasz

    Általában megjelöl teljesen helyettesíthető a stratégia mintájának valamilyen ízével, egy stratégia megvalósításával a zászló minden lehetséges értékénél. Ez sokkal könnyebbé teszi az új viselkedés hozzáadását.

    Teljesítménykritikus helyzetekben az indirekció költsége esetleg felszínre kerül, és egyértelmű zászlókká teszi a dekonstrukciót. Ennek ellenére nehezen emlékszem egyetlen esetre, amikor ezt valóban meg kellett tennem.

    Válasz

    Nem, A zászlók nem rosszak vagy gonoszok, amelyeket mindenáron el kell távolítani.

    Fontolja meg a Java “s Pattern.compile (String regex, int zászlók) hívás. Ez egy hagyományos bitmaszk és működik. Pillantás a java konstansaira , és bárhol is látható egy csomó 2 n , tudod, hogy vannak zászlók.

    Ideális felújított világban ehelyett egy EnumSet használna, ahol az állandók ehelyett értékek egy enumban, és ahogy a dokumentáció olvasható:

    Ennek az osztálynak a tér- és időteljesítményének elég jónak kell lennie ahhoz, hogy lehetővé tegye a hagyományos int-alapú “bit zászlók” magas színvonalú, típusbiztonságos alternatívájának használatát.

    Egy tökéletes világban ez a Pattern.compile hívás Pattern.compile(String regex, EnumSet<PatternFlagEnum> flags) lesz.

    Mind azt mondta, még mindig zászlók.Sokkal könnyebb dolgozni a Pattern.compile("foo", Pattern.CASE_INSENSTIVE | Pattern.MULTILINE) vel, mint Pattern.compile("foo", new PatternFlags().caseInsenstive().multiline()) vagy valamilyen más stílussal, amikor megpróbáljuk megtenni azt, ami a zászlók valójában, és jó.

    A zászlók gyakran láthatók, amikor rendszerszintű dolgokkal dolgoznak. Ha valamihez kapcsolódik az operációs rendszer szintjén, akkor valószínűleg van valahol egy jelző – legyen az egy folyamat visszatérési értéke, vagy egy fájl engedélyei, vagy egy socket megnyitásának zászlói. Ha megpróbálja visszafejteni ezeket az eseteket egy boszorkányüldözés során egy észlelt kódszag ellen, akkor valószínűleg rosszabb a kód, mint ha elfogadnák és megértenék a zászlót.

    A probléma akkor fordul elő, amikor az emberek visszaélnek a zászlókkal, ha egymáshoz dobják őket, és frankenflag halmaz létrehozása mindenféle nem kapcsolódó zászlóból, vagy megpróbálja használni őket ott, ahol egyáltalán nem jelennek meg.

    Válasz

    Feltételezem, hogy a metódus aláírásokon belüli zászlókról beszélünk.

    Egyetlen zászló használata elég rossz.

    Ez semmit sem jelent kollégáinak abban az időben, amikor látják. Meg kell nézniük a módszer forráskódját annak megállapítása érdekében, hogy mit csinál. Valószínűleg ugyanabban a helyzetben leszel néhány hónappal a sorban, amikor elfelejted, hogy mi a módszered.

    A zászló átadása a metódusnak általában azt jelenti, hogy a metódus több dologért felelős. A módszer belsejében valószínűleg egy egyszerű ellenőrzést végez a következő sorokon:

    if (flag) DoFlagSet(); else DoFlagNotSet(); 

    Ez az aggodalmak gyenge elkülönítése, és általában megtalálhatja a módját.

    Általában két külön módszerem van:

    public void DoFlagSet() { } public void DoFlagNotSet() { } 

    Ennek több értelme lesz az Ön által megoldott problémára alkalmazható metódusokkal.

    Több zászló átadása kétszer olyan rossz. Ha valóban több zászlót kell átadnia, akkor fontolja meg, hogy ezeket egy osztályba foglalja. Akkor is ugyanazzal a problémával fog szembesülni, mivel a módszer valószínűleg több dolgot is végrehajt.

    Válasz

    Jelzők és a legtöbb temp változó erős szagú. A legvalószínűbb, hogy ezeket át lehet alakítani és lekérdezési módszerekkel helyettesíteni.

    Felülvizsgált:

    Az állapot kifejezésekor a jelzőket és a temp változókat át kell dolgozni a lekérdezési módszerekre. Az állapotértékeket (logikai értékeket, intseket és más primitíveket) szinte mindig el kell rejteni a megvalósítás részleteinek részeként.

    A vezérléshez, az útválasztáshoz és az általános programfolyamathoz használt jelölők szintén jelezhetik lehetőség a vezérlő struktúrák egyes szakaszainak átalakítására külön stratégiákba vagy gyárakba, vagy bármilyen helyzeti helyzetbe, amelyek továbbra is használják a lekérdezési módszereket.

    Válasz

    Amikor a zászlókról beszélünk, tudnunk kell, hogy a program végrehajtása során módosulni fognak, és hogy állapotuk alapján befolyásolják a program viselkedését. Mindaddig, amíg ügyesen ellenőrizzük ezt a két dolgot, azok kiválóan fognak működni.

    A jelzők akkor működhetnek jól, ha

    • Ön megfelelő hatókörben határozta meg őket. Megfelelően azt értem, hogy a hatókör nem tartalmazhat olyan kódot, amelyet nem kellene / nem kellene módosítania. Vagy legalább a kód biztonságos (például nem hívható közvetlenül kívülről)
    • Ha szükség van kívülről érkező zászlók kezelésére, és ha sok zászló van, akkor a zászlókezelőt egyetlen módként kódolhatjuk a zászlók biztonságos módosításához. Ez a zászlókezelő magában foglalhatja a zászlókat és a módosításuk módszereit. Ezután elkészítheti szingliként, majd megoszthatja azokat az osztályok között, amelyeknek hozzáférésre van szükségük a zászlókhoz.
    • És végül a karbantarthatóság érdekében, ha túl sok a zászló:
      • Nem kell mondanom, hogy kellene kövesse az értelmes elnevezést
      • Dokumentálnia kell az érvényes értékekkel (lehet, hogy felsorolással)
      • Dokumentálnia kell azzal, AMELYIK KÓD MÓDOSÍTJA mindegyiket, és azzal is, hogy MILYEN FELTÉTELT fog eredményezni egy adott érték hozzárendeléséhez a zászlóhoz.
      • MELYIK KÓD FOGYASZTJA őket és MILYEN MAGATARTÁS eredményez egy adott értéket

    Ha nagyon sok zászló van, a jó tervezési munkának meg kell előznie, mivel a zászlók kulcsszerepet játszanak a program viselkedésében. A modellezéshez áttekintheti az állami diagramokat. Az ilyen diagramok dokumentációként és vizuális útmutatásként is működnek, miközben foglalkoznak velük.

    Amíg ezek a dolgok a helyükön vannak, azt hiszem, ez nem vezet rendetlenséghez.

    Válasz

    A kérdésből azt feltételeztem, hogy a minőségbiztosítás zászlós (globális) változókat jelent, és nem egy függvényparaméter bitjeit.

    Vannak helyzetek ahol nincs sok más lehetősége. Például operációs rendszer nélkül ki kell értékelnie a megszakításokat.Ha egy megszakítás nagyon gyakran bekövetkezik, és nincs ideje hosszas értékelésre az ISR-ben, akkor nem csak megengedett, de néha a legjobb gyakorlat is, hogy csak néhány globális zászlót állítson be az ISR-be (minél kevesebb időt töltsön el) az ISR-ben), és értékelje ezeket a zászlókat a fő hurokban.

    Válasz

    Nem hiszem, hogy bármi abszolút rossz a programozásban, valaha.

    Van még egy olyan helyzet, amikor a zászlók rendben lehetnek, ami még nem kerültek itt említésre …

    Fontolja meg a lezárások használatát ebben a Javascript-részletben:

    exports.isPostDraft = function ( post, draftTag ) { var isDraft = false; if (post.tags) post.tags.forEach(function(tag){ if (tag === draftTag) isDraft = true; }); return isDraft; } 

    A belső funkció átadásra kerül az “Array.forEach” fájlra, nem lehet egyszerűen “true” értékre térni.

    Ezért az államot kint kell tartani egy zászlóval.

    Vélemény, hozzászólás?

    Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük