Загварчлалын төрөл

Орчуулгыг бүтэн эхээр нь та wordpress-ээс болон   gitbook.com  -с  үзэх боломжтой.

Эдгээр тестийн аргуудын нэг сонирхолтой зүйл нь миний хувьд тестийн арга хэрхэн загварчлах шийдвэрт нөлөөлдөгт оршдог. Хоёр аргын хөгжүүлэгч нартай уулзаж ярилцсанаар би тухайн аргуудын дэмждэг загварчлалын хоорондын ялгааны талаар тодорхой ойлголттой болсон. Хэдий тийм ч би дөнгөж өнгөц төдий ойлголттой байгаа гэдэгтээ эргэлзэхгүй байна.

Аргуудын ялгааны талаар би дээр давхаргуудад нэвтрэх хэсэгт дурьдсан. Дууриамал тестийн арга **outside-in** аргачлалыг дэмждэг бол **domain model** -г түрүүлж хөгжүүлэхийг илүүд үздэг хөгжүүлэгчид сонгодог аргачлалаар замнадаг.

Миний анзаарсан нэг зүйл гэвэл дууриамал аргаар хөгжүүлэгчид цуглуулагч объекттой методуудыг илүүд үздэг тул утга буцаадаг методуудаас ер нь татгалзах хандлагатай байдаг. Жишээлбэл: *Report*-үүсгэхийн тулд бүлэг объектуудаас мэдээлэл цуглуулах үйлдлийг авч үзье. Хэвшсэн нэг нийтлэг арга бол *report* хийдэг метод бүлэг объектуудын *string* буцаадаг методуудыг дуудан, үр дүнгүүдийг нь нэгтгэн тур зуурын хувьсагчдад хадгалдаг. Харин дууриамал аргаар хөгжүүлэгч үүнээс илүүтэйгээр **string buffer** -ыг бүлэг объектуудад дамжуулж, тэдгээрийг дамжуулсан *buffer* руу буцаах *string* утгуудыг нь хийлгэдэг. Ингэж **string buffer**-ыг утга цуглуулагч параметер гэж үздэг.

Дууриамал аргаар хөгжүүлэгчид мөн ‘train wrecks’ – методуудын гинжин дуудлага *getThis().getThat().getTheOther()* -с аль болох татгалзах талаар илүү ярьдаг. Үүнийг мөн **Law of Demeter** гэж ч нэрлэдэг. Хэдийгээр гинжин методууд асуудал болдог ч (smell), эсрэгээр хэтэдсэн **middle men** объектууд ч мөн асуудал болдог. (Би байнга **Law of Demeter**-ыг **Suggestion of Demeter** гэж дууддаг ч байгаасаа гэж хүсдэг.)

Объект хандалтад (Object Oriented) загварчлалд хүмүүсийн ойлгоход нилээд бэрх зүйлүүдийн нэг нь “Tell Don’t Ask” зарчим. Энэ зарчим объектоос мэдээллийг булааж аваад хэрэглэгчийн хэсэгт хийхийн оронд таныг объектодоо хийх зүйлээ шууд хэлэхийг тулгадаг. Дууриамал тестийн арга энэ зарчмыг илүү хөхүүлэн дэмжиж, хэтэдсэн **getter** -үүдээс мөн татгалздаг гэж тухайн аргаар хөгжүүлэгчид ярьдаг. Сонгодог аргаар хөгжүүлэгчид харин үүнээс болгоомжлох өөр олон аргууд байдаг гэж маргадаг.

Төлвөөр батлах (state-based verification) -ын нэг хүлээн зөвшөөрөгдсөн асуудал нь энэхүү арга зөвхөн төлөв шалгах зорилгоор ашиглагдах **query** методуудыг бий болгодог.
Зөвхөн тестлэхийн тулд объектын API-д методууд нэмэх нь яав ч тийм сайн зүйл биш. Харин үйлдлээр батлах (behavior verification) аргаар үүнээс ангижрах боломжтой. Үүний эсрэг хийгддэг нэг тайлбар нь иймэрхүү өөрчлөлтууд амьдрал дээр тийм ч том асуудал болдоггүй гэдэг.

Дууриамал аргаар хөгжүүлэгчид role interface -үүдэд ихээхэн анхаарлаа хандуулдаг ба тус арга нь **role interface**-ыг илүүтэй дэмждэг гэдэг. Учир нь хамтын ажиллагаа (collaboration) бүр тус тусдаа дууриамалаар хийгддэг тул энэ нь илүүтэй **role interface** болон хувирдаг гэдэг. Дээрх миний авсан жишээнд **string buffer** -ыг ашиглахын тулд дууриамал аргаар хөгжүүлэгчид тухайн салбарт (domain-д) тохирсон тусгай **role**-ыг илүүтэй үүсгэх байх. Магадгүй тэр нь **string buffer**-ыг **implement** хийсэн байх болов уу.

Эдгээр загварчлалын ялгаа нь ихэнх дууриамал аргаар хөгжүүлэгчдийн хувьд гол хүчин зүйл нь болдог гэдгийг санаж байх хэрэгтэй. TDD-ын үүсэл нь **evolutionary design** (хувьсах загварчлал)-ыг дэмждэг хүчтэй автомат регрессийн тестүүд бий болгох хүслээс үүдэлтэй. Явцын дунд улмаар хөгжүүлэгчид (practioners) тестээ түрүүлж бичих нь загварчлалын процессд илэрхий үр дүнтэй, хүчтэй хувь нэмэр оруулдгыг ойлгож мэдсэн. Дууриамал аргаар хөгжүүлэгчид ямар загварыг сайн бэ гэдэг дээр хүчтэй ойлголттой байдаг учираас тэдгээрийг хүмүүсд таниулж, хүмүүсийг тухайн загвараар хөгжүүлэхэд нь туслах үүднээс дууриамал тестийн сангуудыг үүсгэсэн байдаг.

 

Нийтлэлийг бүтнээр нь мөн gitbook.com -с унших, татаж авах боломжтой. Холбоос https://www.gitbook.com/book/erheme318/mocks-aren-t-stubs

Advertisements

Хариулт үлдээх

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Өөрчлөх )

Twitter picture

You are commenting using your Twitter account. Log Out / Өөрчлөх )

Facebook photo

You are commenting using your Facebook account. Log Out / Өөрчлөх )

Google+ photo

You are commenting using your Google+ account. Log Out / Өөрчлөх )

Connecting to %s