Язгуурыг тодруулахуй буюу Refactoring
Code refactoring
Програм хангамжын хөгжүүлэлтэд refactoring гэдэг нэршил нь хийгдчихсэн байгаа эх кодын бүтэцийг програмын гадаад шинж чанарт нөлөө үзүүлэлгүйгээр сайжруулан зохион байгуулахыг хэлдэг. Иймд энэ нь алдаа засах эсвэл шинэ үйлдлүүдийг кодод нэмэхээс арай өөр зүйл юм.
Хэрвээ програм хангамжын шинж чанарыг өөрчлөн сайжруулахаар зохиомжлоогүй бол түүнд шинэ боломжуудыг нэмж оруулахад хүндрэл үүсдэг. Үүнийг шийдэхийн тулд эсвэл програмыг бүхэлд нь шинээр хийх эсвэл тухайн шинэ шинж чанарыг нэмэхэд саад учруулж байгаа хэсгийг өөрчлөх болдог. Ингэж кодыг дахин бүтэцчилснээр код ойлгомжтой, дараа өөрчлөлт болон нэмэлт шинж чанар оруулахад хялбар болдог.
Энгийн жишээ гэвэл с гэсэн хувьсагчыг count гэж ойлгомжтой болгон солих. Цаашлаад програм дотор байгаа зарим блокыг дэд функц болгож тусгаарлах. Мөн илүү гүнзгийрвэл if нөхцөлүүдийг polymorphism-оор шийдэх гэх мэт байж болно. Энэ нэр томьёо нь тоо болон олон гишүүнтийг үржвэрт задлах болон язгуурыг олохтой төстэй. Жишээлбэл
\(9=3\times3,\) \(x^2-1=(x-1)(x+1)\)Эдгээр задаргаанууд нь анхны илэрхийлэл болон тооны язгуур бүтэцийг илүү тодорхой болгож өгч байна. Үүнтэй адилаар refactoring хийснээр тухайн кодыг илүү тодорхой бүтэцтэй болгож цаад шинж чанарыг нь илрүүлэн гаргаж тавина гэсэн үг. Гэхдээ кодын язгуурчлалын хувьд тооных шиг цааш задрахгүй болтол нь задлана гэсэн ойлголт байхгүй юм. Өөрийн шаардлагыг хангах хэмжээнд боломжын хирээр язгуурчлахад л хангалттай. Ингээд refactoring гэдэгийг цааш “язгуурчлал” гэж хэлье.
Кодын язгуурчлал хийхэд хэрэглэдэг энгийн аргууд бол:
- Гишүүн хувьсагч болон функцын нэрийг өөрчлөх
- Гишүүн хувьсагч болон шинж чанаруудыг өөр класс руу нүүлгэх
- Код доторх зарим блокыг дэд функц болгон таслах
- Гишүүн хувьсагчыг далдлах(Encapsulation)
- Шинээр класс үүсгэх
- Шинэ интерфэйс тодорхойлох
- Том функцыг жижиг ойлгомжтой хэсгүүдэд хуваах
- Ерөнхий төрөл үүсгэх
- Ерөнхий хэрэглэгдэх функыг дээд класс руу нь зөөх
- Зарим функцыг доод класс руу нь зөөх
- Хэрэггүй кодыг зайлуулах
Extreme programming болон Agile аргачлалд язгуурчлал нь хөгжүүлэлтийн тойргын салшгүй хэсэг байдаг. Хөгжүүлэгчид шинэ тест болон шинэ шинж чанарыг нэмэхдээ өмнөх кодоо язгуурчлах замаар кодын дотоод бүтэцийг ойлгомжтой бөгөөд нийлэмжтэй болгодог. Кодын язгуурчлал нь бага багаар аажмаар кодын бүтцийг өөрчилдөг. Нэг дор олон тооны өөрчлөлт оруулах нь өмнө ажиллаж байсан шинж чанарт гаж нөлөө үзүүлэх магадлалтай. Иймд автомат тестийн техникийг хэрэглэж өөрчлөлтийн дараа өмнө ажиллаж байсан шинж чанарууд хадгалагдаж үлдсэн эсэхийг шалгадаг. Товчдоо бол өөрчлөлт хийхийн өмнө шаардлагатай язгуурчлалуудыг хийгээд код өмнөх шинж чанараа хадгалж үлдсэнийг шалгана, дараа нь нэмэлт шинж чанаруудаа оруулна гэсэн санаа.
Програмын код дахь язгуурчлалаас гадна энгийн текст мэдээллийн хувьд бас refactoring гэдэг ойлголт байх бөгөөд тухайн текстийн утгыг нь хэвээр хадгалж илүү товчхон ойлгомжтойгоор зохион байгуулахыг хэлдэг байна. Ерөнхий санаа ижил. Системийн хөгжүүлэлтийн бусад хэсгүүдэд ч мөн язгуурчлал ил болон далд байдлаар явагдаж байдаг. Тухайлбал Өгөгдлийн сангийн язгуурчлал(Database Refactoring). Өгөгдлийн санг өмнөх шинж чанарыг нь алдагдуулалгүй өөрчлөн зохион байгуулна гэдэг хүндрэлтэй. Учир нь өгөгдлийн сан гэдэг маш олон хэрэглэгчтэй тул түүн дээр суурилж байгаа зүйлсд анзаарагдалгүй өгөгдлийн бүтцэд хөдөлгөөн хийнэ гэдэг бэрх. Мөн язгуурчлалыг төслийн хүрээнд хийж болно. Захиалагчын шаардлагад өөрчлөлт нөлөөлөл оруулалгүйгээр төслийн зохион байгуулал, дотоод үйл явц болон хэрэгжүүлэх арга барилд өөрчлөлт оруулан сайжруулалт хийх. Тухайн өөрчлөлтийг хийснээр төслийн үйл явц болон хурд, төлөвлөгөө урьдын хэвээр үргэлжилж байх ёстой бөгөөд энэ нь дараагийн томоохон өөрчлөлтийн бэлтгэл ажил болно. Ингэснээр төслийн бүтэц, хэрэгжүүлэх арга барил болон дэд хэсгүүд илүү тодорхой, зөв зохион байгуулалтад орж ирээдүйд гарч ирч болох шаардлагын өөрчлөлт, рискийг давах чадвар нь дээшлэнэ гэсэн үг. Төслийн язгуурчлалын жишээ гэвэл, тухайн хүнийхээ дадлага чадварт илүү тохирсон ажил дээр шилжүүлэн хуваарьлах, гар нийлдэг хүмүүсийг нэг багт оруулах, бусад ажлуудын ахицад түлхэц өгөх ажлийг эхэнд авчирч хүч нэмэх гэх мэт байж болно. Ингэснээр ерөнхий төлөвлөгөө болон гарцууд хэвээр боловч төслийн зохион байгуулал, бүтэц илүү чийрэг болох юм.
Эцэст нь хөгжүүлэлтийн процессийн хувьд язгуурчлал ямар байх тухай санаагаа хэлье. Хөгжүүлэлтийн процесс гэдэг маань өмнөх тулгуур дээрээ дөрөөлөн үргэлж өөрчлөгдөж сайжирч байдаг зүйл учраас язгуурчлал хийгдэж байх нь зайлшгүй. Хөгжүүлэлтийн процесстоо ямар нэг шинэ зүйл оруулж ирэх шаардлагатай болоход одоо хэвийн ажиллаж байгаа хөгжүүлэлтийн процессынхоо чухал нэгэн хэсэгийг шууд халаад хаячихаж болохгүй учраас тухайн хэсэгт язгуурчлал хийж шинэ боломжыг оруулж ирэх үүдийг нээж өгөх юм. Үүний дараа бид шаардлагатай байгаа шинэ санаа болон ухагдахуунаа оруулж ирэхэд дөхөмтэй болно.
Жишээ болгож дараах маягын язгуурчлалыг авч үзье. Бид код бичихдээ эхлээд дотроо юу хийх билээ гэдгээ бүдүүн тойм төсөөлөөд түүнийгээ хийдэг. Тэрийгээ хийчихлээ гэж үзвэл дараачийн илүү нарийн зүйлээ код дээрээ нэмээд бичээд явдаг шүү дээ. Гэтэл энэ дарааллыг язгуурчлаад үзвэл дотор нь тестээр удирдагдах хөгжүүлэлтийн(test driven development-TDD) үндсэн санаа явж байна: Эхлээд тестээ тодорхойлно, дараа нь кодоо бичнэ, код маань тестийг давах эсэхийг шалгана, давахгүй бол ахиад кодоо бичсээр, давсны дараа дахин шинэ тест тодорхойлно -гэсэн дарааллыг тестээр удирдагдах хөгжүүлэлт(TDD) гэдэг. Дээр дурдсан алхамуудад эхлээд наад захын хийх зүйлээ тодорхойлох гэдэгийг тестээ тодохойлох болгоод, дараа дараагийн алхамуудыг TDD-ийнхтэй нийцүүлээд язгуурчилвал бид өмнө байсан зүйлээ өөрчлөөд TDD-ийг язгуурчлаад гаргаад ирж байна. Ер нь TDD болон Agile чиглэлийн аргачлалууд нь жижиг системийг хөгжүүлэхэд тохиромжтой гэдэг ч үнэндээ том системийн дэд хэсгүүдийг хоорондоо хамаарал багатайгаар зохиомжилж чадвал хэсэг бүрийн хувьд TDD эсвэл бусад Agile аргачлалыг хэрэглэх замаар том системийг хөгжүүлэхэд ч Agile хандлагыг үр өгөөжтэй хэрэглэж болох нь харагдаж байна.
Ер нь хөгжүүлэлтийн процесс бол байнга өөрчлөгдөн сайжирч байх жамтай учраас анхнаасаа процессынхоо загварыг ирээдүйд шинэ санаа болон аргачлалыг оруулж ирэхэд нээлттэй байдлаар алсыг харж тодорхойлох нь чийрэг, чадамжтай хөгжүүлэлтийн процессыг бүрдүүлэх үндэс суурь нь билээ.
Холбоосууд: