Mer

Bruker hvis annet uttalelse i Python Parser of Field Calculator i ArcGIS for Desktop?


Jeg trenger hjelp til å skrive python-skriptet i feltkalkulatoren. Jeg har tre felt, nemlig: CODE COMPLEX Map1

Map1 er et tomt felt som jeg vil fylle ut. Jeg har en rekke forhold å imøtekomme i et enkelt Map1-felt. f.eks. Hvis CODE er 1.1.7 og COMPLEX er 4, skal utgangen for Map1 være 1.3, og disse forholdene fortsetter med forskjellige CODE- og COMPLEX-verdier. Jeg har prøvd å skrive det slik, men det fungerer ikke:

Parser Python

Kodeblokk

def Omklassering (! KODE!,! KOMPLEKS!): hvis (! KODE! == 1.1.7 og! KOMPLEKS! == 4): returner 1.3 elif (! KODE! == 3.2.0 og! KOMPLEKS! == 4 ): returner 1.3 annet: retur 0

Kart1 =

Omklassifisering (! KODE!,! KOMPLEKS!)

Kan noen fortelle meg hvor jeg gjør en feil? Eller noen annen måte å gjøre det på?


Problemet er i kodeblokken din.

I stedet for:

def Omklassering (! KODE!,! KOMPLEKS!): hvis (! KODE! == 1.1.7 og! KOMPLEKS! == 4): returner 1.3 elif (! KODE! == 3.2.0 og! KOMPLEKS! == 4 ): returner 1.3 annet: retur 0

prøve:

def Omklassering (CODE, COMPLEX): hvis (CODE == "1.1.7" og COMPLEX == 4): returnerer 1.3 elif (CODE == "3.2.0" og COMPLEX == 4): returnerer 1.3 annet: retur 0

Utropstegnene er nødvendige i uttrykket ditt, fordi de angir feltnavn, men i kodeblokkenKODEogKOMPLEKSer Python-variabler og kan kallesenogbhvis du ville.

Det andre problemet er at KODE-feltet ditt ser ut til å være av typen tekst, så jeg har lagt til anførselstegn rundt testene av verdiene. Jeg kan ikke fortelle om Map1- og COMPLEX-feltene er tekst eller tall, så jeg har ikke lagt dem der - du må kanskje!


Python hvis funksjon for rangert felt

Egentlig er dette en Python i GIS, så jeg bruker tabell i Arcgis og prøver å telle feltet og dele det med kategori.

Jeg har navnet Field Høyde dataene inneholder heltalsexempel:
1 - 2
3 - 6
2 - 3
8.5 - 12
11 - 12

Jeg må kategorisere det ved hjelp av regel det
hvis høyde & lt 1 så indeks = 0,3, hvis høyde = 2-3 indeks = 0,6, hvis høyde> 3 indeks = 1

spørsmålet mitt er hvordan jeg skal strippe det, og kategorisere det ved hjelp av regelen min ovenfor? Takk før


Du skriver feil på funksjonene dine. I feltkalkulatoren må du merke av for "Vis kodeblock" slik at Kode før logisk skript vises. Skriv inn funksjonen din i førlogikkboksen -

og deretter i boksen under, der det står feltnavn = du skal skrive navnet på funksjonen og feltverdien du sender til den, omgitt av utrop. Så hvis funksjonen din ovenfor heter calcValue, vil du skrive

Uten å se en grafikk av hvordan feltkalkulatoren din ser ut, mistenker jeg at @csterling sannsynligvis har rett. Imidlertid er et alternativ å bare velge etter attributt der "mamerMN" & lt = 0.151560, deretter feltberegne de valgte funksjonene til 1 på vanlig måte uten å kreve en kodeblokk.


4 svar 4

Takk for at du tok opp dette - jeg har også lagt merke til en høyere frekvens av flaggede feltkalkulator spørsmål. Jeg tror at alle spørsmål knyttet til en GIS-feltkalkulator er på emnet. Feltkalkulatoren har sine egne særegenheter, for eksempel å pakke felt i! FieldName! for ArcGIS. Med dette sagt blir selv de mest rene Python-konseptene GIS-konsepter, ettersom de nå har programvarespesifikke krav. Jeg vil også legge til at spørsmål om feltkalkulator har blitt flagget mer rutinemessig det siste året eller så, noe som antyder at flaggene kan komme fra en eller få individer, ikke samfunnet som helhet.

Jeg lurer på om løsningen er å lete etter det tidligste Python Parser of the Field Calculator-spørsmålet og i stor grad redigere det for å bli en Community Wiki Q & ampA-rett Bruker du Python Parser of the Field Calculator of ArcGIS for Desktop? som starter noe i retning av:

Dette er en Community Wiki Q & ampA som er ment å dekke alle aspekter ved bruk av Python Parser of the Field Calculator of ArcGIS for Desktop som er ikke ren Python.

Pure Python-spørsmål som er utenfor begynnereksemplene som er gitt som svar nedenfor, bør undersøkes / stilles på Stack Overflow.

Svarene kan variere fra Fjernelse av retur / ny linje ( n) karakter fra felt ved hjelp av Python og feltkalkulator ?, til noen av de andre særegenheter som innpakning av felt i utropstegn (! FieldName!), Og til noen av de mest spurte "nybegynnere" Python "tips som kommer ut av alle spørsmål og svar vi har sett så langt.

Kandidater til "nybegynnerspørsmål" for å prøve å dekke over kan komme fra denne vanlige spørsmålene.

Hensikten ville være å peke alle fremtidige Python Parser-nybegynnerspørsmål tilbake til denne som duplikater, og å omdirigere eventuelle komplekse spørsmål relatert til feltkalkulatoren som likevel er ren Python som skal undersøkes / stilles ved Stack Overflow.

En lignende tilnærming kan brukes til å lage en Community Wiki for bruk av Python med feltkalkulatoren til QGIS.

Målet med å lage disse Canonical Q & ampAs er å unngå at samfunnet trenger å svare på veldig lignende spørsmål om og om igjen, noe som gir liten ny verdi og betyr at besøkende på nettstedet må vasse gjennom potensielt hundrevis av Q & ampAs i stedet for en enkelt veldig bra skrevet Q & ampA fra samfunnet om emnet.

Dette er en av mine favoritt typer spørsmål, og jeg er personlig skuffet når de er stengt som utenfor emnet. Python-spørsmålene kommer aldri til å stoppe, så GIS SE kan like godt tilpasse seg i stedet for å avvise dem.

Her er mitt forslag til et nytt spørsmål som skal betegnes som FAQ om beregning av kanoniske felt. Jeg tenkte at jeg ville foreslå det her i stedet for på hovedsiden, slik at det kan finpusses og diskuteres. Jeg vil også foreslå at du oppretter et nytt spørsmål i stedet for å gjenta et eksisterende spørsmål slik at vi har full kontroll over innholdet (et tomt skifer, i utgangspunktet).


1 Svar 1

Åpne en Python-konsoll og kjør følgende linje:

re.search (r "" "((. *?))" "", "Witless Bay (1001559) T 00000 (6,5%)")

Du vil se at det returnerer et matchobjekt (& # 60_sre.SRE_Match-objekt på 0x15AB2E60 & # 62) som @mikewatt kommenterte.

Det er ingen måte ArcGIS kan sette inn dette objektet i et felt. Du må bruke gruppemetoden.

I følge det foregående eksemplet kan du få tilgang til gruppene avhengig av resultatet. I dette tilfellet kan du bare få to grupper, og (antar jeg) at du er interessert i den andre:


6.1. Mer om moduler¶

En modul kan inneholde kjørbare setninger samt funksjonsdefinisjoner. Disse uttalelsene er ment å initialisere modulen. De blir bare henrettet først gang modulenavnet oppdages i en importerklæring. 1 (De kjøres også hvis filen kjøres som et skript.)

Hver modul har sin egen private symboltabell, som brukes som den globale symboltabellen av alle funksjonene som er definert i modulen. Dermed kan forfatteren av en modul bruke globale variabler i modulen uten å bekymre seg for utilsiktede sammenstøt med brukerens globale variabler. På den annen side, hvis du vet hva du gjør, kan du berøre en moduls globale variabler med samme betegnelse som referert til funksjonene, modname.itemname.

Moduler kan importere andre moduler. Det er vanlig, men ikke nødvendig å plassere alle importuttalelser i begynnelsen av en modul (eller skript, for den saks skyld). De importerte modulnavnene plasseres i importmodulens globale symboltabell.

Det er en variant av importoppgaven som importerer navn fra en modul direkte til importtabellens symboltabell. For eksempel:

Dette introduserer ikke modulnavnet som importeres fra, i den lokale symboltabellen (så i eksemplet er fibo ikke definert).

Det er til og med en variant for å importere alle navn som en modul definerer:

Dette importerer alle navn unntatt de som begynner med understreking (_). I de fleste tilfeller bruker ikke Python-programmerere dette anlegget siden det introduserer et ukjent sett med navn i tolken, muligens skjuler noen ting du allerede har definert.

Vær oppmerksom på at generelt sett er det vanskelig å importere * fra en modul eller pakke, siden det ofte forårsaker dårlig lesbar kode. Det er imidlertid greit å bruke den til å lagre skriving i interaktive økter.

Hvis modulnavnet blir fulgt av som, blir navnet som følger bundet direkte til den importerte modulen.

Dette importerer effektivt modulen på samme måte som import av fibo vil gjøre, med den eneste forskjellen i at den er tilgjengelig som fib.

Den kan også brukes når du bruker fra med lignende effekter:

Av effektivitetsgrunner importeres hver modul bare en gang per tolkesession. Derfor, hvis du endrer modulene dine, må du starte tolk på nytt - eller hvis det bare er en modul du vil teste interaktivt, bruk importlib.reload (), f.eks. import importlib importlib.reload (modulnavn).

6.1.1. Utføre moduler som skript¶

Når du kjører en Python-modul med

koden i modulen blir utført, akkurat som om du importerte den, men med __name__ satt til & quot__main __ & quot. Det betyr at ved å legge til denne koden på slutten av modulen:

du kan gjøre filen brukbar som et skript så vel som en importerbar modul, fordi koden som analyserer kommandolinjen bare kjører hvis modulen kjøres som "hoved" -filen:

Hvis modulen importeres, kjøres ikke koden:

Dette brukes ofte for å gi et praktisk brukergrensesnitt til en modul, eller for testformål (kjøring av modulen som et skript utfører en testpakke).

6.1.2. Modulsøkestien¶

Når en modul med navnet spam blir importert, søker tolken først etter en innebygd modul med det navnet. Hvis den ikke blir funnet, søker den etter en fil med navnet spam.py i en liste over kataloger gitt av variabelen sys.path. sys.path er initialisert fra disse stedene:

Katalogen som inneholder inndataskriptet (eller den gjeldende katalogen når ingen fil er spesifisert).

PYTHONPATH (en liste over katalognavn, med samme syntaks som skallvariabelen PATH).

Installasjonsavhengig standard.

På filsystemer som støtter symlinker, blir katalogen som inneholder inngangsskriptet beregnet etter at symlinket er fulgt. Med andre ord er katalogen som inneholder symlink ikke lagt til modulsøkestien.

Etter initialisering kan Python-programmer endre sys.path. Katalogen som inneholder skriptet som kjøres, plasseres i begynnelsen av søkebanen, foran standardbibliotekstien. Dette betyr at skript i den katalogen lastes inn i stedet for moduler med samme navn i bibliotekkatalogen. Dette er en feil med mindre erstatningen er ment. Se avsnittet Standardmoduler for mer informasjon.

6.1.3. “Kompilerte” Python-filer¶

For å øke hastigheten på lasting av moduler, cacher Python den kompilerte versjonen av hver modul i __pycache__-katalogen under navnemodulen. versjon .pyc, der versjonen koder formatet til den kompilerte filen, inneholder den vanligvis Python-versjonsnummeret. I CPython release 3.3 vil den kompilerte versjonen av spam.py for eksempel bli bufret som __pycache __ / spam.cpython-33.pyc. Denne navngivningskonvensjonen tillater samle moduler fra forskjellige utgivelser og forskjellige versjoner av Python å eksistere sammen.

Python sjekker endringsdatoen for kilden mot den kompilerte versjonen for å se om den er utdatert og må kompileres på nytt. Dette er en helt automatisk prosess. Også de kompilerte modulene er plattformuavhengige, slik at det samme biblioteket kan deles mellom systemer med forskjellige arkitekturer.

Python sjekker ikke cachen under to omstendigheter. For det første kompileres det alltid og lagrer ikke resultatet for modulen som er lastet direkte fra kommandolinjen. For det andre sjekker den ikke hurtigbufferen hvis det ikke er noen kildemodul. For å støtte en ikke-kilde (kun kompilert) distribusjon, må den kompilerte modulen være i kildekatalogen, og det må ikke være en kildemodul.

Du kan bruke bryterne -O eller -OO på Python-kommandoen for å redusere størrelsen på en kompilert modul. -O-bryteren fjerner påstandssetninger, -OO-bryteren fjerner både påstandssetninger og __doc__-strenger. Siden noen programmer kan stole på å ha disse tilgjengelige, bør du bare bruke dette alternativet hvis du vet hva du gjør. “Optimaliserte” moduler har et alternativ og er vanligvis mindre. Fremtidige utgivelser kan endre effekten av optimalisering.

Et program kjører ikke raskere når det leses fra en .pyc-fil enn når det leses fra en .py-fil. Det eneste som er raskere med .pyc-filer er hastigheten de blir lastet med.

Modulen compileall kan opprette .pyc-filer for alle modulene i en katalog.

Det er mer detaljer om denne prosessen, inkludert et flytskjema over beslutningene, i PEP 3147.


ArcGIS for opplæringskurs for romlig analyse

ArcGIS * er et geografisk informasjonssystem for å jobbe med kart og geografisk informasjon. Bruk og implementer vanlige GIS-teknikker i ArcGIS for å lage dataromatiske prosjekter.

Denne instruktørledede, live opplæringen (online eller på stedet) er rettet mot feltøkologer og bevaringsledere som ønsker å lage dataromatiske prosjekter i ArcGIS.

Ved slutten av denne opplæringen vil deltakerne kunne:

  • Send ut romlige data som visualiseringer, for eksempel kart.
  • Utfør geostatikk på faktiske data.
  • Implementere romlig dataanalyse, databehandling og kartlegging med ArcGIS.
  • Analyser romlige data for prosjekter i ArcGIS.

Kursets format

  • Interaktiv forelesning og diskusjon.
  • Mange øvelser og øvelse.
  • Praktisk implementering i et live-lab miljø.

Kurstilpasningsalternativer

  • Hva er GIS?
  • ArcGIS-versjoner
  • Lag, attributter, funksjoner, valg og attributtabeller

Geospatiale og romlige data

Forbereder utviklingsmiljøet

ArcGIS og dets funksjoner

  • Bruk og visualisering av geodata
  • Identifisere funksjoner og verdier
  • Opprette valg
  • Zoome og måle
  • Bruke ShapeFile-geometri
  • Arbeidskoordinatsystemer
  • Ved hjelp av ArcCatalog
  • Endrer metadata
  • Viser raster
  • Sammenslåing av raster
  • Resampling og omklassifisering av raster
  • Klipper en raster
  • Henter ut rasterverdipoeng
  • Geo-referanse en raster
  • Bruke ShapeFile-attributter
  • Romlig sammenføyning med tabelldata
  • Lage korofleth-kart
  • Implementering av nye datafiler
  • Tegning av nye funksjoner
  • Plotte poeng
  • Bli med data
  • Klipp av data
  • Opprette buffere

Finaliseringer og optimaliseringer

  • Bruke kartoppsett
  • Arbeide med et lokaliseringskart
  • Å skape legender
  • Implementering av skalaer og titler
  • Eksport og utskrift av kart

* ArcGIS er et varemerke, tjenestemerke og registrert merke fra Esri i USA, EU og andre internasjonale jurisdiksjoner. Esri har ikke vurdert dette kurset for fullstendighet, nøyaktighet eller kvalitet, og støtter ikke, sponser eller tilknytter dette kurset.


Del 2: Arbeide med Social Explorer

Data, data, data!

La oss snakke om datamanipulering i ArcMap, som er en av kjernefunksjonene til ethvert GIS-program. Innen ArcMap & # 8220joining & # 8221 eller & # 8220connecting & # 8221 data er en grunnleggende oppgave for å jobbe mellom data fra forskjellige kilder. Det er to grunnleggende & # 8220joining & # 8221 -metoder tilgjengelig:

  1. Bli med og # 8211 koble en ekstern datakilde til et GIS-datasett
  2. Spatial Join & # 8211 koble data basert på geografi

Denne workshopen vil fokusere på den første & # 8220joining & # 8221-metoden, som er mer anvendelig for ikke-geografiske datasett, som Excel-regneark, CSV-er og andre datatabeller.

Tilegne seg data

Social Explorer gir data for hele USAs folketelling (1790 til 2010) og American Community Survey (2005 til 2015).

Sjekk ut dette!

La oss laste ned sysselsettingsdata fra Social Explorer:

  1. Gå til Social Explorer og klikk på & # 8220Tabeller& # 8221-fanen
  2. Velg & # 8220American Community Survey (5-Year Estimates) & # 8221
  3. Klikk på & # 8220Begynn rapporten& # 8221 for den nyeste undersøkelsen
  4. Velg & # 8220fylke& # 8221 for geografisk type, uthev & # 8220Alle fylker& # 8221 og klikk på & # 8220Legg til& # 8221-knappen, og klikk deretter på & # 8220Fortsett til tabeller
  5. Klikk på & # 8220Velg etter nøkkelord& # 8221-fanen, og skriv & # 8220arbeid
  6. Fremhev & # 8220T33. Sysselsettingsstatus for antall innbyggere fra 16 år og oppover& # 8221 og klikk på & # 8220Legg til& # 8221 og deretter & # 8220Vis resultater
  7. Klikk på Overskrift for at tabellen skal gå til Data Dictionary-siden som beskriver disse dataene. Dette åpnes i et nytt vindu. Hold dette vinduet åpent, vi kommer tilbake til det senere.
  8. Gå tilbake til rapportsiden, og klikk på & # 8220Nedlasting av data& # 8221-fanen
  9. Klikk på & # 8220Fylkesdata (CSV)& # 8221-lenke for å laste ned dataene til prosjektmappen. Gi filen navnet & # 8220sysselsetting.csv

Importer dataene til ArcMap

La oss importere denne nye sysselsettingstabellen til ArcMap.

  1. Klikk på legge til data og importer sysselsetting.csv bord
  2. Høyreklikk på tabellen (fra venstre innholdsfortegnelse) og gå til & # 8220eiendommer
  3. Som standard oppretter sosialutforsker mange kolonner, hvorav mange vi ikke trenger. Klikk på & # 8220fjern merket for alle& # 8221-knappen (ser ut som et tomt papir), og velg følgende felt:
    1. Geo_FIPS
    2. Geo_NAME
    3. SE_T033_001
    4. SE_T033_002
    5. SE_T033_003
    6. SE_T033_004
    7. SE_T033_005
    8. SE_T033_006
    9. SE_T033_007

    Det ledende null marerittet & # 8230

    Åpne attributtabellen for sysselsettingstabellen. Legg merke til kolonnen Geo_FIPS. Den første platen er for Autauga County i Alabama. Geo_FIPS er & # 82201001 & # 8221. Imidlertid er & # 8220real & # 8221 FIPS-koden for Autauga County & # 822001001 & # 8221 (med en ledende & # 82200 & # 8221). Arc tolker kolonnen som numerisk, og beskjærer derfor eventuelle ledende nuller i kolonnen. Dette utgjør et problem når vi trenger å bruke denne kolonnen for å koble dataene til et annet lag med samme FIPS-kode. Følgende python-kode løser dette problemet ved å opprette en ny kolonne og legge til de ledende nuller:

    1. Klikk på tabellmenyknappen, og klikk på & # 8220Legg til felt & # 8230
    2. Navngi det nye feltet & # 8220FIPS& # 8220, skriv & # 8220Tekst& # 8220, og lengde & # 82205
    3. I tabellvisningen høyreklikker du på den nye kolonneoverskriften, og klikker & # 8220Feltkalkulator
    4. I feltkalkulatoren velger du & # 8220Python & # 8221-parseren, og skriver inn følgende formel: str (! Geo_FIPS!) .Zfill (5)

    Bli med data

    Nå er vi klare til å bli med på sysselsettingsdataene våre i fylkeslaget.

    1. Høyreklikk på & # 8220us_counties“, “Blir med og forholder seg“, “Bli med & # 8230
    2. Velg & # 8220FIPS& # 8221 som feltet for å bli med, velg & # 8220arbeid& # 8221 bord, og velg også & # 8220FIPS& # 8221 å basere sammenføyningen på.
    3. Høyreklikk på & # 8220us_counties& # 8221 og gå til & # 8220Eiendommer“, “Symbologi& # 8220. Husk nå & # 8230 kategorien Data Dictionary som du åpnet da du lastet ned dataene fra Social Explorer? Det er her det er nyttig, da datafeltene ikke er beskrivende. Hvis du mistet fanen, er den igjen:
    4. La oss kartlegge nasjonens arbeidsledighet. For & # 8220Verdi& # 8220, velg & # 8220Arbeidsledig& # 8220, eller & # 8220SE_T033_006“.
    5. La oss også normalisere dataene etter den sysselsettbare befolkningen. For & # 8220Normalisering& # 8220, velg & # 8220Befolkning fra 16 år og oppover& # 8220, eller & # 8220SE_T033_001
    6. Sysselsettingsgraden i desember 2017 er kl 4.1%. La oss bygge et kart som visuelt gjenspeiler denne hastigheten.
    7. Klikk på & # 8220Klassifisere& # 8221-knapp
    8. Velg & # 8220Håndbok
    9. I & # 8220Bryte verdier& # 8221-boksen, skriv inn følgende pauser: 0.02, 0.04, 0.06, 0.08
    10. Klikk OK. Tilbake i skjermbildet for lagegenskaper, velg en fargrampe som går fra & # 8220kald & # 8221 til & # 8220hot & # 8221. Røde farger bør vanligvis brukes til å symbolisere problemområder, så vend fargene om nødvendig (høyreklikk på overskriften & # 8220Symbol“).
    11. I & # 8220Merkelapp& # 8221-kolonnen, merk hvert symbol som følger:

    Du er ferdig!


    Lexer.l

    Dette fungerer, men det går tregt (2.165 s) på maskinen min, med den samme millionlinjens inndatafil som nevnt i svaret mitt på det andre spørsmålet.

    Jeg prøvde det på noen forskjellige måter, men jeg klarte ikke å få en versjon som var raskere enn PHP-koden i det andre spørsmålet. Bryteroppgavelogikken er uten tvil litt for smart og lagrer bare de nødvendige feltene i ønsket rekkefølge, men hastigheten var omtrent den samme som den enkle implementeringen.

    Hvis det betyr noe, bruker jeg gcc versjon 10.1 og flex 2.6.4 på en 64-bit Linux-maskin.


    Jeg tror ikke du grunnleggende vil være i stand til å løse utbredelsen, siden du har et problem som består av mange små detaljer. Disse vil ikke forsvinne uansett hvor godt du organiserer dem, men det er alternativer som hjelper deg med å organisere dem på måter med mindre algoritmiske ytelsestreff.

    Hvis du kan bruke en versjon av python med PEP-443, er det noen andre alternativer, men forutsatt at du ikke har en enkelt forsendelsesstøtte i pythonet ditt (jeg tror bare alfas / beta er utgitt ennå), eller du vil gjøre ting manuelt, er det ganske mulig å implementere dette ved hjelp av diktkartingstyper for å fungere som alternativ til if / elif-treet eller manglende bryteruttalelse. Den ytre kunne se ut slik:

    Jeg er ikke helt fornøyd med lambdas, selv om jeg valgte dem for kortere kodelengde. Det meste av hvorfor denne koden ser kortere ut, skyldes ikke å implementere den nestede halvdelen av den opprinnelige koden. Men jeg tror jeg foretrekker lesbarheten for det meste.

    Jeg har problemer med å finne ut hva denne funksjonen gjør. Jeg sluttet å konsentrere meg da jeg nådde den andre uttalelsen og så en annen stor if-blokk. Nestede tilstander som dette er for mye for min lille menneskelige hjerne.

    Problemet er at denne funksjonen er veldig lavt - alt som funksjonen gjør er skrevet ut i detalj. Jeg vil si at rundt 90% av kodelinjene i denne funksjonen handler om hvordan funksjonen gjør det den gjør, ikke hva det gjør det faktisk, selv om hva er langt viktigere enn hvordan.

    Så målet med å forbedre koden (hvilken som helst kode, ikke bare denne koden) burde være å gjøre de viktige punktene blindt åpenbare og pusse de kjedelige, forvirrende detaljene under teppet. Husk at du kanskje må lese denne koden på nytt om ett år, når du først har glemt hva den handler om. Du vil sannsynligvis oppdage at hjernen din ikke er stor nok heller!

    Med det i tankene, ville det enkleste du kunne gjøre for å forbedre denne koden, bruke refraktoren 'Extract Method' (vel, 'Extract Function' i dette tilfellet) på hver arm av din store if-blokk. En god tommelfingerregel er at hver arm i en stor if-blokk skal være en linje lang. Denne refactoring kalles 'Decompose Conditional'. Hvis du navngir de ekstraherte metodene nøye, vil toppnivåfunksjonen være krystallklar i intensjonene.

    Det er også en god ide å bruke isinstance, i stedet for å eksplisitt slå på typen, for å gjøre funksjonene dine mer underklassevennlige. Hvis noen av typene du slår på er underklasser av hverandre, må du kanskje bestille Elif-utsagnene dine på nytt for å unngå å endre funksjonen til funksjonen. (Jeg håper du har enhetstester!)

    Et kort eksempel på hvordan ekstraksjonsmetoder kan rydde opp i en funksjon:

    Det er åpenbart hva denne funksjonen gjør nå! Hvis argumentet er TypeDecl, går det tilbake på decl.type hvis det er en Union, så oppretter det en uniondefinisjon hvis det er en ukjent type, så lager den en annen struktur for det og så videre. Dessuten kan du fortelle hva hver ekstraherte funksjon gjør også - bare les navnene! Dette vil gjøre det lettere å finne koden du leter etter når du trenger å feilsøke den.

    Til slutt er det verdt å påpeke at hvis denne typen bryter vises mer enn en gang i programmet ditt, får du bruke min personlige favorittrefaktoring, 'Erstatt betinget med polymorfisme'. Dette innebærer i utgangspunktet å flytte den gjentatte betingede logikken til en enkelt fabrikkfunksjon, som returnerer forskjellige implementeringer av et grensesnitt.


    Se videoen: Basic Field Calculator (Oktober 2021).