Shártnama boyınsha dizayn

**Shártnama boyınsha dizayn (DbC)**, **shártnama boyınsha programmalastırıw**, **shártnama menen programmalastırıw** hám **shártnama boyınsha dizayn programmalastırıw** dep te ataladı, bul programmalıq támiynattı proektlestiriw usılı bolıp tabıladı.

Ol programmalıq támiynat dizaynerleriniń programmalıq támiynat komponentleri ushın abstrakt maǵlıwmat túrleriniń ádettegi anıqlamasın aldınǵı shártler, keyingi shártler hám invariantlar menen keńeytetuǵın formal, anıq hám tekseriletuǵın interfeys specifikaciyaların anıqlawın talap etedi. Bul specifikaciyalar biznes shártnamalarınıń shártleri hám minnetlemeleri menen konceptual metaforaǵa sáykes «shártnamalar» dep ataladı.

DbC usılı server komponentindegi operaciyanı shaqıratuǵın barlıq klient komponentleri sol operaciya ushın talap etilgen aldınǵı shártlerdi orınlaydı dep boljaydı.

Bul boljaw júdá qáwipli dep esaplanǵan jaǵdayda (kóp kanallı yamasa bólistirilgen esaplawdaǵı sıyaqlı), kerisinshe usıl qollanıladı, yaǵnıy server komponenti barlıq tiyisli aldınǵı shártlerdiń durıs ekenin tekseredi (klient komponentiniń sorawın qayta islewden aldın yamasa qayta islew waqtında) hám eger olay bolmasa, sáykes qáte xabarın qaytaradı.

## Tariyxı
Bul termin Bertran Meyer tárepinen Eiffel programmalastırıw tilin proektlestiriwge baylanıslı oylap tabılǵan hám birinshi ret 1986-jıldan baslap hár túrli maqalalarda hám onıń «Obyektke baǵdarlanǵan programmalıq támiynat qurılısı» kitabınıń eki izbe-iz basılımında (1988, 1997) táriyiplengen. Eiffel Software 2003-jıl dekabrde Shártnama boyınsha dizayn ushın sawda belgisin dizimnen ótkeriwge arza berdi hám ol 2004-jıl dekabrde berildi. Bul sawda belgisi házirgi waqıtta Eiffel Software kompaniyasına tiyisli.

Shártnama boyınsha dizayn óziniń tamırların formal tekseriw, formal specifikaciya hám Xoar logikası boyınsha jumıslardan aladı. Dáslepki úleslerge tómendegiler kiredi:

* Dizayn processin basqaratuǵın anıq metafora
* Miyrasqa qollanıw, ásirese qayta anıqlaw hám dinamikalıq baylanıstırıw ushın formalizm
* Ayrıqsha jaǵdaylardı qayta islewge qollanıw
* Avtomat programmalıq támiynat hújjetlestiriwi menen baylanısı

## Táriyip
DbC-niń oraylıq ideyası — programmalıq támiynat sistemasınıń elementleriniń óz-ara minnetlemeler hám paydalar tiykarında bir-biri menen qalay islesetuǵını haqqındaǵı metafora. Bul metafora biznes ómirinen alınǵan, onda «klient» hám «jetkerip beriwshi» mısalı, tómendegilerdi anıqlaytuǵın «shártnamaǵa» kelisedi:

* Jetkerip beriwshi belgili bir ónimdi usınıwı kerek (minnetleme) hám klienttiń óz tólemin tólegenin kútiwge haqılı (payda).
* Klient tólemdi tólewi kerek (minnetleme) hám ónimdi alıwǵa haqılı (payda).
* Eki tárep te barlıq shártnamalarǵa qollanılatuǵın nızamlar hám qaǵıydalar sıyaqlı belgili bir minnetlemelerdi orınlawı kerek.

Sonday-aq, eger obyektke baǵdarlanǵan programmalastırıwdaǵı klastıń metodı belgili bir funkcional imkaniyattı usınsa, ol tómendegilerdi isley aladı:

* Onı shaqıratuǵın hár qanday klient modulinen kiriwde belgili bir shárttiń kepilligin kútiw: metodtıń aldınǵı shárti — klient ushın minnetleme hám jetkerip beriwshi (metodtıń ózi) ushın payda, sebebi ol onı aldınǵı shártten tıs jaǵdaylardı qayta islewden azat etedi.
* Shıǵıwda belgili bir qásiyetti kepillew: metodtıń keyingi shárti — jetkerip beriwshi ushın minnetleme hám álbette klient ushın payda (metodtı shaqırıwdıń tiykarǵı paydası).
* Kiriwde boljanǵan hám shıǵıwda kepillengen belgili bir qásiyetti saqlaw: klass invariantı.

Shártnama minnetlemelerdi rásmiylestiretuǵın Xoar úshligine semantikalıq jaqtan ekvivalent. Bunı dizayner shártnamada qayta-qayta juwap beriwi kerek bolǵan «úsh soraw» menen qısqasha aytıwǵa boladı:

* Shártnama neni kútedi?
* Shártnama nege kepillik beredi?
* Shártnama neni saqlaydı?

Kóp programmalastırıw tillerinde usınday tastıyıqlawlar islew ushın imkaniyatlar bar. Degen menen, DbC bul shártnamalardı programmalıq támiynattıń durıslıǵı ushın sonshelli áhmiyetli dep esaplaydı, olar dizayn processiniń bir bólimi bolıwı kerek. Negizinde, DbC tastıyıqlawlardı birinshi jazıwdı usınadı. Shártnamalar kod kommentariyaları menen jazılıwı, test kompleksi menen májbúr etiliwi yamasa ekewi de bolıwı múmkin, hátte shártnamalar ushın arnawlı til qollap-quwatlawı bolmasa da.

Shártnama túsinigi metod/procedura dárejesine shekem keńeyedi; hárbir metod ushın shártnama ádette tómendegi informaciya bólimlerin óz ishine aladı: 

* Qabıl etiletuǵın hám qabıl etilmeytuǵın kirgiziw mánisleri yamasa túrleri hám olardıń mánisleri
* Qaytarılatuǵın mánisler yamasa túrler hám olardıń mánisleri
* Payda bolıwı múmkin bolǵan qáte hám ayrıqsha jaǵday mánisleri yamasa túrleri hám olardıń mánisleri
* Qosımsha tásirler
* Aldınǵı shártler
* Keyingi shártler
* Invariantlar
* (siyrek ushırasadı) Ónimlilik kepillikleri, mısalı, paydalanılǵan waqıt yamasa orın ushın

Miyras ierarxiyasındagı kishi klasslarǵa aldınǵı shártlerdi hálsizlendiriwge (biraq kúsheytiwge emes) hám keyingi shártler menen invariantlardı kúsheytiwge (biraq hálsizlendiriwge emes) ruqsat etiledi. Bul qaǵıydalar minez-qulıq kishi tiplestiriwine jaqınlasadı.

Barlıq klass qatnasları klient klassları menen jetkerip beriwshi klassları arasında boladı. Klient klassı jetkerip beriwshi ózgesheliklerine shaqırıwlar jasawǵa minnetli, bunda jetkerip beriwshiniń nátiyjedegi jaǵdayı klient shaqırıwı tárepinen buzılmaydı. Keyinirek, jetkerip beriwshi klienttiń jaǵday talapların buzbaytuǵın qaytarıw jaǵdayın hám maǵlıwmatların usınıwǵa minnetli.

Mısalı, jetkerip beriwshi maǵlıwmat buferi óshiriw ózgesheligi shaqırılǵanda buferde maǵlıwmat bar bolıwın talap etiwi múmkin. Keyinirek, jetkerip beriwshi klientke óshiriw ózgesheligi jumısın tamamlaǵanda, maǵlıwmat elementi shınında da buferden óshiriletuǵının kepilleydi. Basqa dizayn shártnamaları — klass invariantı túsinikleri. Klass invariantı (lokal klass ushın) hárbir ózgeshelik orınlanıwı aqırında klasstıń jaǵdayı belgilengen sheklewler ishinde saqlanatuǵının kepilleydi.

Shártnamalardı paydalanǵanda, jetkerip beriwshi shártnama shártleriniń qanaatlandırılǵanın tekseriwge urınbawı kerek — bul ámeliyat hújimlik programmalastırıw dep ataladı — ulıwma ideya kodtıń «qattı islemey qalıwı» kerek ekenliginde, bunda shártnamanı tekseriw qáwipsizlik torı bolıp tabıladı.

DbC-niń «qattı islemey qalıw» qásiyeti shártnama minez-qulqın sazlawdı ańsatlastıradı, sebebi hárbir metodtıń jobalanǵan minez-qulqı anıq kórsetilgen.

Bul usıl qorǵanıw programmalastırıwınan ádewir ayırmashılıq etedi, onda jetkerip beriwshi aldınǵı shárt buzılǵanda ne islew kerekligin anıqlawǵa juwapker. Kóbirek jaǵdaylarda, jetkerip beriwshi klientke aldınǵı shárttiń buzılǵanın bildiriw ushın ayrıqsha jaǵday taslaydı hám ekewinde de — DbC-de de, qorǵanıw programmalastırıwında da — klient oǵan qalay juwap beriw kerekligin anıqlawı kerek. Bunday jaǵdaylarda DbC jetkerip beriwshiniń jumısın ańsatlastıradı.

Shártnama boyınsha dizayn sonıń menen birge programmalıq támiynat moduli ushın durıslıq kriteriylerin de anıqlaydı:

* Eger klient tárepinen jetkerip beriwshi shaqırılmastan aldın klass invariantı HÁM aldınǵı shárt durıs bolsa, onda xızmet tamamlanǵannan keyin invariant HÁM keyingi shárt durıs boladı.
* Jetkerip beriwshige shaqırıwlar islegende, programmalıq támiynat moduli jetkerip beriwshiniń aldınǵı shártlerin buzıwı kerek emes.

Shártnama boyınsha dizayn sonıń menen birge kodtı qayta paydalanıwdı da ańsatlastıra aladı, sebebi hárbir kod bólimi ushın shártnama tolıq hújjetlestirilgen. Modul shártnamaları sol moduldiń minez-qulqı ushın programmalıq támiynat hújjetlestiriwiniń bir túri retinde qaralıwı múmkin.

Shártnama boyınsha dizayn tómendegishe kóriniwi múmkin:
```cpp
int f(const int x)
pre(x != 1) // aldınǵı shárt tastıyıqlawı
post(r : r == x && r != 2) // keyingi shárt tastıyıqlawı; r f-tiń nátiyje obyektin ataydı
{
contract_assert(x != 3); // tastıyıqlaw operatorı
return x;
}
```


## Ónimlilik aqıbeti
Shártnama shártleri qátesiz programmanıń orınlanıwı waqtında hesh qashan buzılmawı kerek. Sonlıqtan shártnamalar ádette tek programmalıq támiynattı islep shıǵıw waqtında debag rejiminde tekseriledi. Keyin shıǵarılıwda, ónimlilikti maksimallastırıw ushın shártnama tekseriwleri óshiriledi.

Kóp programmalastırıw tillerinde shártnamalar assert penen ámelge asırıladı. Assertler C/C++ tillerinde standart túrde shıǵarılıw rejiminde kompilyaciyalanbaydı hám C#-ta hám Java-da da usıǵan uqsas deaktivaciyalanadı.

Python interpretatorın «-O» («optimallastırıw» ushın) argumenti menen iske túsiriw de Python kodı generatorınıń assertler ushın hesh qanday bayt-kod shıǵarmawına alıp keledi.

Bul islep shıǵıwda paydalanılǵan assertlerdiń sanı hám esaplaw quramalılıǵına qaramastan, ónim kodındaǵı assertlerdiń orınlanıw waqtındaǵı shıǵınların nátiyjeli joq etedi, sebebi bunday kórsetpeler kompilyator tárepinen ónim kodına kirgizilmeydi.

## Programmalıq támiynattı testlew menen baylanısı
Shártnama boyınsha dizayn birlik testlewi, integraciya testlewi hám sistema testlewi sıyaqlı ádettegi testlew strategiyaların almastırmaydı. Kerisinshe, ol sırtqı testlewdi bólek testlerde de, test basqıshında ónim kodında da aktivlestiriliwi múmkin bolǵan ishki óz-ózin tekseriwler menen tolıqtıradı.

Ishki óz-ózin tekseriwlerdiń artıqmashılıǵı — olar qátelerdi klient tárepinen baqlanatuǵın nadurıs nátiyjeler retinde payda bolmastan aldın anıqlay aladı. Bul erterek hám anıǵıraq qáte anıqlawǵa alıp keledi.

Tastıyıqlawlardı paydalanıw shártnama boyınsha dizayn implementaciyasın testlew usılı, test orakulınıń bir túri retinde qaraladı.

## Derekler

__BÖLİDİMÖNDEMEW__