Vastaa

Lippuja käyttävää koodia ylläpidettäessä olen nähnyt, että osavaltioiden määrä kasvaa nopeasti, ja tiloja on melkein aina. Yksi esimerkki omasta kokemuksestani: työskentelin koodin parissa, jossa oli nämä kolme lippua.

bool capturing, processing, sending; 

Nämä kolme loivat kahdeksan tilaa (itse asiassa oli kaksi muuta lippua) yhtä hyvin). Koodi ei kattanut kaikkia mahdollisia arvoyhdistelmiä, ja käyttäjät näkivät virheitä:

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

Kävi ilmi, että oli tilanteita, joissa if-lauseen oletus yllä oleva oli väärä.

Liput pyrkivät sekoittumaan ajan myötä ja piilottavat luokan todellisen tilan. Siksi niitä tulisi välttää.

Kommentteja

  • +1, " tulisi välttää ". Lisäisin jotain aiheesta ', mutta liput ovat välttämättömiä joissakin tilanteissa ' (jotkut saattavat sanoa ' välttämätön paha ')
  • @TrevorBoydSmith Kokemukseni mukaan ne eivät ole, tarvitset vain hieman enemmän kuin keskimääräinen aivoteho, jota varten käytät lippu
  • Esimerkissäsi sen olisi pitänyt olla yksi valtiota edustava enum, ei kolmea boolea.
  • Saatat joutua samanlaiseen ongelmaan kuin mitä minä ' m edessä juuri nyt. Kaikkien mahdollisten tilojen kattamisen lisäksi kahdella sovelluksella voi olla sama lippu (esim. Asiakastietojen lataaminen). Tällöin vain yksi lataaja käyttää lippua, asettaa sen pois päältä ja onnea ongelman löytämisessä jatkossa.

Vastaa

Tässä on esimerkki lipuista.

Minulla on koodinpätkä, joka generoi salasanoja (käyttäen salauksellisesti turvallista näennäissatunnaislukugeneraattoria). Menetelmän soittaja valitsee salasanan ei tulisi sisältää isoja kirjaimia, pieniä kirjaimia, numeroita, perustunnuksia, laajennettuja symboleja, kreikkalaisia symboleja, kyrillisiä ja unicode.

Lippujen kanssa tämän menetelmän kutsuminen on helppoa:

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

ja se voidaan jopa yksinkertaistaa:

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

Mikä olisi metodin allekirjoitus ilman lippuja?

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

kutsutaan näin:

 // 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);  

Kuten kommenteissa todettiin, toinen tapa olisi käyttää kokoelmaa:

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

Tämä on paljon luettavampi verrattuna ryhmään true ja false, mutta sillä on kuitenkin kaksi haittapuolta:

Suurin haittapuoli on se, että yhdistettyjen arvojen, kuten CharacterSet.LettersAndDigits kirjoitat jotain sellaista menetelmällä Generate():

 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. }  

kirjoitettu mahdollisesti näin:

 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. }  

Vertaa tätä siihen, mitä sinulla on lippujen avulla:

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

s econd, hyvin pieni haittapuoli on, että ei ole selvää, miten menetelmä käyttäytyisi, jos sitä kutsutaan näin:

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

Kommentit

  • Uskon, että OP viittaa loogisiin tai kokonaislukumuuttujiin, joille annat arvon tietyissä paikoissa, sitten alhaalla tarkistat sitten orterissa tehdä jotain tai ei, kuten esimerkiksi käyttämällä newItem = true sitten joitain rivejä if (newItem ) then
  • @MainMa Ilmeisesti siellä ' sa 3rd: Versio, jossa on 8 loogista argumenttia, ajattelin lukiessani " -lippuja " …
  • Anteeksi, mutta IMHO on täydellinen tapa metodiketjuun ( fi.wikipedia.org/wiki/Method_chaining), Lisäksi voit käyttää parametriryhmää (sen on oltava assosiatiivinen taulukko tai kartta), jossa jokin jättämäsi parametriryhmän merkintä käyttää oletusarvokäyttäytymistä parametrille. Loppujen lopuksi kutsu menetelmäketjun tai parametriryhmien kautta voi olla yhtä ytimekäs ja ilmeikäs kuin bittiliput, eikä kaikilla kielillä ole bittioperaattoreita (pidän itse asiassa binaarilipuista, mutta käytän juuri mainitsemiani menetelmiä). / li>
  • Se ' ei ole kovin OOP, eikö niin? I ' d tehdään käyttöliittymä ala: Merkkijono myNewPassword = makePassword (randomComposeSupplier (uusi RandomLowerCaseSupplier (), uusi RandomUpperCaseSupplier (), uusi RandomNumberSupplier)); merkkijonolla makePassword (toimittaja < Merkki > charSupplier); ja toimittaja < Merkki > randomComposeSupplier (Toimittaja < Merkki > … toimittajat); Nyt voit käyttää toimittajiasi muihin tehtäviin, säveltää ne millä tahansa tavalla ja yksinkertaistaa generaattisalasanamenetelmääsi, jotta se käyttää vähäistä tilaa.
  • @Dibbeke Puhu substantiivien valtakunta

vastaus

Haju on valtava toimintalohko , ei lippuja. Jos asetat lipun riville 5, tarkista vain lippu rivillä 354, niin se on huono. Jos asetat lipun riville 8 ja tarkistat lipun riville 10, se on hieno. Lisäksi yksi tai kaksi lippua koodilohkossa on kunnossa, 300 lippua toiminnossa on huono.

Vastaa

Yleensä liput voidaan korvata kokonaan jollakin strategiamallin makulla, yksi strategian toteutus jokaiselle lipun mahdolliselle arvolle. Tämä tekee uuden käyttäytymisen lisäämisestä paljon helpompaa.

Suorituskyvyn kannalta kriittisissä tilanteissa suuntaamattomuus saattaa nousee ja tekee purkamisesta selkeät liput. Tästä huolimatta minulla on vaikeuksia muistaa yksittäinen tapaus, jossa minun piti tehdä se.

Vastaa

Ei, liput eivät ole pahoja tai pahoja, jotka on korjattava hinnalla millä hyvänsä.

Harkitse Java ”s Pattern.compile (String regex, int liput) puhelu. Tämä on perinteinen bitimaski ja se toimii. Katsaus -vakioihin jaavassa ja missä näet joukon 2 n -tiedostoa, tiedät, että lippuja on siellä.

Ihanteellisessa refraktoidussa maailmassa käytetään sen sijaan EnumSet -kohtaa, jossa vakiot ovat sen sijaan arvoja luettelossa ja dokumentaation mukaan:

Tämän luokan tilan ja ajan suorituskyvyn tulee olla riittävän hyvät, jotta sitä voidaan käyttää korkealaatuisena, tyyppiturvallisena vaihtoehtona perinteisille int-pohjaisille ”bittilipuille”.

Täydellisessä maailmassa Pattern.compile-kutsusta tulee Pattern.compile(String regex, EnumSet<PatternFlagEnum> flags).

Kaikki se sanoi, sen edelleen liput.On paljon helpompaa työskennellä Pattern.compile("foo", Pattern.CASE_INSENSTIVE | Pattern.MULTILINE) kanssa kuin jos olisi Pattern.compile("foo", new PatternFlags().caseInsenstive().multiline()) tai jokin muu tyyli yrittää tehdä mitä liput todella ovat ja hyvä.

Lippuja nähdään usein työskenneltäessä järjestelmätason asioiden kanssa. Kun liityt johonkin käyttöjärjestelmän tasolla, todennäköisesti on jokin lippu – olipa kyseessä prosessin palautusarvo, tiedoston oikeudet tai liput pistorasian avaamiseen. Yritetään refraktoida nämä tapaukset eräässä noita metsästyksessä havaitun koodihaju vastaan todennäköisesti johtaa huonompaan koodiin kuin jos sitä käytetään hyväksymään ja ymmärtämään lippu.

Ongelma ilmenee, kun ihmiset käyttävät väärin lippuja heittäen niitä yhteen ja luodaan frankenflag-joukko kaikenlaisia etuyhteydettömiä lippuja tai yritetään käyttää niitä siellä, missä niitä ei ole.

Vastaa

Oletan, että puhumme lipuista metodin allekirjoituksissa.

Yhden lipun käyttö on tarpeeksi huono.

Se ei merkitse mitään kollegoillesi, kun he näkevät sen. Heidän on tarkasteltava menetelmän lähdekoodia selvittääkseen, mitä se tekee. Olet todennäköisesti samassa asemassa muutama kuukausi linjaa pitkin, kun unohdat metodisi tarkoituksen.

Lipun välittäminen menetelmälle tarkoittaa yleensä sitä, että menetelmäsi on vastuussa useista asioista. Menetelmän sisällä olet todennäköisesti tekemässä yksinkertaista tarkistusta riveillä:

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

Se on huono huolenaihe ja voit yleensä löytää tien kiertää sen.

Minulla on yleensä kaksi erillistä tapaa:

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

Tämä on järkevämpää metodinimillä, jotka soveltuvat ratkaistavaan ongelmaan.

Useiden lippujen välittäminen on kaksi kertaa huonompaa. Jos sinun on todella läpäistävä useita lippuja, harkitse niiden kapselointia luokassa. Silloin kohtaat edelleen saman ongelman, koska menetelmäsi todennäköisesti tekee useita asioita.

Vastaa

Liput ja useimmat lämpötilamuuttujat ovat voimakas haju. Todennäköisesti ne voidaan korjata uudelleen ja korvata kyselymenetelmillä.

Tarkistettu:

Liput ja lämpötilamuuttujat, kun tilaa ilmaistaan, tulee palauttaa kyselymenetelmiin. Tila-arvot (booleanit, intit ja muut primatiivit) tulisi melkein aina piilottaa osana toteutuksen yksityiskohtia.

Ohjaukseen, reititykseen ja yleiseen ohjelmavirtaan käytettävät liput voivat myös osoittaa mahdollisuus refraktoida ohjausrakenteiden osiot erillisiksi strategioiksi tai tehtaiksi tai mihin tahansa tilannekohtaisesti sopivaan, jotka edelleen käyttävät kyselymenetelmiä.

Vastaus

Kun puhumme lipuista, meidän tulisi tietää, että ne muuttuvat ohjelman suorituksen aikana ja että ne vaikuttavat ohjelman käyttäytymiseen tilojensa perusteella. Niin kauan kuin meillä on siisti hallinta näissä kahdessa asiassa, ne toimivat hyvin.

Liput voivat toimia hyvin, jos

  • Olet määrittänyt ne sopivassa laajuudessa. Tarkoitan tarkoituksenmukaisesti, että soveltamisalaan ei tulisi sisältyä koodia, jota ei tarvitse / ei tarvitse muuttaa. Tai ainakin koodi on suojattu (esimerkiksi sitä ei voida kutsua suoraan ulkopuolelta)
  • Jos on tarpeen käsitellä lippuja ulkopuolelta ja jos lippuja on paljon, voimme koodata lippujen käsittelijän ainoana tapana muokata lippuja turvallisesti. Tämä lippujen käsittelijä voi itse kapseloida liput ja menetelmät niiden muokkaamiseksi. Se voidaan sitten tehdä yksinäiseksi ja jakaa sen jälkeen luokkien kesken, jotka tarvitsevat lippujen käyttöoikeuden.
  • Ja lopuksi ylläpidettävyyden vuoksi, jos lippuja on liikaa:
    • Ei tarvitse sanoa, että heidän pitäisi noudata järkevää nimeämistä
    • Pitäisi dokumentoida voimassa olevilla arvoilla (voi olla luetelluilla)
    • Pitäisi dokumentoida MILLÄ KOODI MUUTTAA kutakin niistä, ja MITÄ EHDOT johtavat määritettäessä lippulle tietty arvo.
    • MITÄ KOODI kuluttaa niitä ja MITÄ KÄYTTÄMINEN johtaa tiettyyn arvoon

Jos lippuja on helvetissä paljon, hyvää suunnittelutyötä tulisi edeltää, koska liput alkavat sitten olla avainasemassa ohjelmakäyttäytymisessä. Voit etsiä tilakaavioita mallinnusta varten. Tällaiset kaaviot toimivat myös dokumentaationa ja visuaalisena ohjauksena käsitellessään niitä.

Niin kauan kuin nämä asiat ovat paikoillaan, se ei mielestäni johda sekaannukseen.

Vastaus

Oletin kysymyksestä, että laadunvalvonta tarkoitti lippumuuttujia (globaaleja) eikä funktioparametrin bittejä.

On tilanteita missä sinulla ei ole paljon muita mahdollisuuksia. Esimerkiksi ilman käyttöjärjestelmää sinun on arvioitava keskeytykset.Jos keskeytys tapahtuu hyvin usein ja sinulla ei ole aikaa suorittaa pitkäaikaista arviointia ISR: ssä, on paitsi sallittua, mutta joskus jopa parasta käytäntöä asettaa vain joitain globaaleja lippuja ISR: ään (sinun tulisi käyttää mahdollisimman vähän aikaa kuin mahdollista ISR: ssä) ja arvioida päälenkkisi liput.

Vastaa

En ajattele kaikki on ehdoton paha ohjelmoinnissa, koskaan.

On myös toinen tilanne, jossa liput saattavat olla järjestyksessä, mikä ei vielä mainittu täällä …

Harkitse sulkemisten käyttöä tässä Javascript-koodinpätkässä:

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

Sisäinen toiminto välitetään ”Array.forEach” -kohtaan, ei voi vain ”palata tosi”.

Siksi sinun on pidettävä valtio ulkona lipulla.

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *