Ohjelman syklomaattinen monimutkaisuus on rakenteellinen (tai topologinen) tietokoneohjelman monimutkaisuuden mitta . Toimenpiteen kehitti Thomas J. McCabe vuonna 1976.
Syklomaattista monimutkaisuutta laskettaessa käytetään ohjelman ohjausvuokaaviota . Graafin solmut vastaavat jakamattomia ohjelmakäskyryhmiä, ne on yhdistetty suunnatuilla reunoilla , jos toista solmua vastaava komentoryhmä voidaan suorittaa välittömästi ensimmäisen solmun komentoryhmän jälkeen. Syklomaattinen monimutkaisuus voidaan laskea myös yksittäisille funktioille , moduuleille , menetelmille tai luokille ohjelman sisällä.
McCabe käytti testauksessa syklomaattisen monimutkaisuuden laskentaa . Hänen ehdottamana menetelmänä oli testata jokainen lineaarisesti riippumaton reitti ohjelman läpi, jolloin tarvittavien testien määrä on yhtä suuri kuin ohjelman syklomaattinen monimutkaisuus. [yksi]
Ohjelmakoodin syklomaattinen monimutkaisuus on ohjelmakoodin läpi kulkevien lineaarisesti riippumattomien reittien lukumäärä . Jos lähdekoodi ei esimerkiksi sisällä haarapisteitä tai silmukoita, niin monimutkaisuus on yksi, koska koodin läpi on vain yksi reitti. Jos koodissa on yksi lause IF, joka sisältää yksinkertaisen ehdon, koodissa on kaksi polkua: yksi, jos lauseen ehto IFon tosi, TRUEja toinen, jos FALSE.
Matemaattisesti strukturoidun ohjelman [2] syklomaattinen monimutkaisuus määritetään käyttämällä suunnattua graafia , jonka solmut ovat reunoilla yhdistettyjä ohjelmalohkoja, jos ohjaus voidaan siirtää lohkosta toiseen. Sitten monimutkaisuus määritellään seuraavasti: [3] :
M = E − N + 2 P ,missä:
M = syklomaattinen kompleksisuus, E = kaavion reunojen lukumäärä, N = kaavion solmujen lukumäärä, P = liitäntäkomponenttien lukumäärä .Toinen muotoilu käyttää kaaviota, jossa jokainen lähtöpiste on yhdistetty sisääntulopisteeseen. Tässä tapauksessa graafi on vahvasti kytketty ja ohjelman syklomaattinen monimutkaisuus on yhtä suuri kuin graafin syklomaattinen luku (tunnetaan myös nimellä ensimmäinen Betti-luku ), joka määritellään [3]
M = E − N + P .Tämän määritelmän voidaan ajatella laskevan graafissa olevien lineaarisesti riippumattomien syklien lukumäärän, toisin sanoen niiden syklien, jotka eivät sisällä muita syklejä. Koska jokainen poistumispiste on yhdistetty sisääntulopisteeseen, jokaiselle poistumispisteelle on vähintään yksi jakso.
Yksinkertaiselle ohjelmalle, aliohjelmalle tai menetelmälle P on aina 1. Syklomaattinen monimutkaisuus voi kuitenkin koskea useita tällaisia ohjelmia tai aliohjelmia (esimerkiksi kaikkiin luokan menetelmiin ), jolloin P on yhtä suuri kuin kyseessä olevat aliohjelmat , koska jokainen aliohjelma voidaan esittää itsenäisenä graafin osana.
Voidaan osoittaa, että minkä tahansa strukturoidun ohjelman syklomaattinen monimutkaisuus, jossa on vain yksi aloituspiste ja yksi lähtökohta, vastaa kyseisen ohjelman sisältämien haarapisteiden (eli lauseiden iftai ehdollisten silmukoiden) lukumäärää plus yksi. [3] [4]
Syklomaattinen monimutkaisuus voidaan laajentaa ohjelmaan, jossa on useita lähtöpisteitä; tässä tapauksessa se on [4] [5]
π − s + 2,missä:
π on ohjelman haarautumispisteiden lukumäärä, s on poistumispisteiden lukumäärä.Muodollisesti syklomaattinen monimutkaisuus voidaan määritellä suhteelliseksi Betti-luvuksi :
eli " graafin G ensimmäinen homologia terminaalisten solmujen t suhteen . Tämä on toinen tapa sanoa "lineaarisesti riippumattomien polkujen lukumäärä kaavion läpi tulosta lähtöön".
Syklomaattinen monimutkaisuus voidaan myös laskea absoluuttisen Betti-luvun suhteen (absoluuttista homologiaa käyttäen, ei suhteellista) yhdistämällä tietyn komponentin kaikki päätesolmut (mikä vastaa lähtöpisteiden yhdistämistä sisääntulopisteeseen), tässä tapauksessa uusi, laajennettu, kaavio
Yksi McCaben alkuperäisistä käyttötavoista oli rajoittaa ohjelmien monimutkaisuutta kehityksen aikana. Hän suosittelee, että ohjelmoijia vaaditaan laskemaan kehittämiensä moduulien monimutkaisuus ja jakamaan moduulit pienempiin aina, kun näiden moduulien syklomaattinen monimutkaisuus ylittää kymmenen. [3] NIST sisällytti tämän käytännön Structural Testing -metodologiaan havainnolla, että McCaben alkuperäisen julkaisun jälkeen 10:n valinta on saanut vahvaa tukea, mutta joissain tapauksissa saattaa olla tarkoituksenmukaista lieventää rajoitusta ja sallia moduulien monimutkaisuus. 15. Tässä menetelmässä tunnustetaan, että joskus voi olla syitä ylittää sovittu raja. Tämä on muotoiltu suositukseksi: "Jokaisen moduulin syklomaattinen monimutkaisuus tulisi joko rajoittaa sovittuihin rajoihin tai antaa kirjallinen selitys siitä, miksi raja ylitettiin."
Toinen syklomaattisen monimutkaisuuden käyttötarkoitus on määrittää täydelliseen koodin peittoon vaadittavien testien määrä .
Se on hyödyllinen, koska M :n syklomaattisella kompleksisuudella on kaksi ominaisuutta tietylle moduulille :
Syklomaattista kompleksisuutta käytetään yhtenä parametrina ylläpidettävyysindeksissä [ 6 ] .