درک پیچیدگی سیکلت در GO: یک راهنمای جامع

سلام ، نام من ولید است ، یک توسعه دهنده پشتیبان که در حال حاضر یاد می گیرد با نوشتن درباره آن در طول مسیر ، سفر من را به اشتراک می گذارد.
منبع:
- کتاب زبان برنامه نویسی GO توسط آلن Aa Donovan & Brian W. Kernighan
- دوره تعطیلات مت
در توسعه نرم افزار ، نوشتن کد تمیز ، حفظ و کارآمد بسیار مهم است. یک معیار مهم که در دستیابی به این هدف کمک می کند این است پیچیدگیبشر این متریک به توسعه دهندگان کمک می کند تا با کمیت تعداد مسیرهای مستقل از طریق کد منبع برنامه ، پیچیدگی کد خود را ارزیابی کنند. در این مقاله ، ما به مفهوم پیچیدگی سیکلومی ، اهمیت آن در برنامه نویسی GO ، روش هایی برای اندازه گیری آن و استراتژی هایی برای کاهش آن برای کیفیت بهتر کد خواهیم پرداخت.
پیچیدگی سیکلواتیک چیست؟
پیچیدگی Cyclomatic یک متریک نرم افزاری است که توسط Thomas J. McCabe در سال 1976 معرفی شده است. این تعداد مسیرهای خطی مستقل را از طریق کد منبع یک برنامه اندازه گیری می کند و نشانگر پیچیدگی کد است. یک مقدار پیچیدگی سیکلت بالاتر یک برنامه پیچیده تر را نشان می دهد ، که ممکن است درک ، آزمایش و حفظ آن سخت تر باشد.
پیچیدگی سیکلومی یک برنامه را می توان با استفاده از فرمول محاسبه کرد:
m = e – n + 2p
کجا:
- (م) = پیچیدگی سیکلت
- (ه) = تعداد لبه ها (انتقال بین گره ها) در نمودار جریان کنترل
- (n) = تعداد گره ها (بیانیه ها یا نقاط تصمیم گیری) در نمودار جریان کنترل
- (P) = تعداد اجزای متصل (به طور معمول 1 برای یک برنامه واحد)
به عبارت ساده تر ، پیچیدگی سیکلتیک نیز می تواند با شمارش تعداد نقاط تصمیم گیری تعیین شود (مانند if
با for
با switch
، و غیره) در یک عملکرد و اضافه کردن 1.
اهمیت پیچیدگی سیکلت در GO
در GO ، مانند سایر زبانهای برنامه نویسی ، پیچیدگی سیکلت به عنوان شاخص کیفیت کد عمل می کند. توابع با پیچیدگی زیاد سیکلومی اغلب مستعد خطاها ، آزمایش سخت تر و حفظ چالش برانگیز هستند. با نظارت و مدیریت این متریک ، توسعه دهندگان GO می توانند:
- قابلیت حفظ کد را افزایش دهید: عملکرد ساده تر درک و اصلاح ساده تر است.
- قابلیت آزمایش را بهبود بخشید: پیچیدگی پایین تعداد موارد آزمایش مورد نیاز برای پوشش کامل را کاهش می دهد.
- کاهش نرخ خطا: کد کمتر پیچیده کمتر احتمال دارد که دارای اشکالات باشد.
اندازه گیری پیچیدگی سیکلت در GO
برای اندازه گیری پیچیدگی های سیکلت در پروژه های GO ، ابزارهایی مانند gocyclo
معمولاً استفاده می شود gocyclo
پیچیدگی های سیکلواتیک توابع موجود در کد منبع GO را محاسبه می کند و به شناسایی توابعی که ممکن است نیاز به اصلاح مجدد داشته باشند ، کمک می کند.
نصب gocyclo
برای نصب gocyclo
، اجرا:
go install github.com/fzipp/gocyclo/cmd/gocyclo@latest
با استفاده از gocyclo
به فهرست پروژه خود بروید و اجرا کنید:
gocyclo -over 10 ./...
این دستور تمام توابع را با پیچیدگی سیکلومی بیش از 10 لیست می کند ، و این نشانگر نامزدهای بالقوه برای اصلاح مجدد است.
استراتژی هایی برای کاهش پیچیدگی سیکلومی در GO
کاهش پیچیدگی سیکلوماتیک منجر به کد خواندنی و قابل حفظ تر می شود. در اینجا برخی از استراتژی های مؤثر وجود دارد:
1. اصلاحات بزرگ در عملکردهای کوچکتر
شکستن توابع پیچیده در توابع کوچکتر و متمرکز باعث وضوح و قابلیت استفاده مجدد می شود.
قبل از اصلاح مجدد:
func ProcessData(data []int) {
for _, v := range data {
if v > 0 {
// Process positive values
} else {
// Process non-positive values
}
}
}
پس از اصلاح مجدد:
func ProcessData(data []int) {
for _, v := range data {
processValue(v)
}
}
func processValue(v int) {
if v > 0 {
// Process positive values
} else {
// Process non-positive values
}
}
این رویکرد ساده را ساده می کند ProcessData
وظایف خاص را به processValue
، کاهش پیچیدگی.
2. برای ساده کردن منطق از بازده های اولیه استفاده کنید
استفاده از بازده های زودهنگام می تواند تو در تو را از بین ببرد if
بیانیه ها ، ساخت کد ساده تر.
قبل از آن:
func ValidateInput(input string) bool {
if len(input) > 0 {
if isValidFormat(input) {
return true
}
}
return false
}
بعد از:
func ValidateInput(input string) bool {
if len(input) == 0 {
return false
}
return isValidFormat(input)
}
این اصلاح مجدد لانه سازی را کاهش می دهد و قصد عملکرد را روشن می کند.
3. شرط های پیچیده را با پلی مورفیسم جایگزین کنید
هنگام برخورد با شرایط متعدد که رفتار را تعیین می کند ، استفاده از رابط ها و پلی مورفیسم را برای ساده کردن کد در نظر بگیرید.
قبل از آن:
func GetDiscount(userType string) float64 {
if userType == "regular" {
return 0.1
} else if userType == "premium" {
return 0.2
} else if userType == "vip" {
return 0.3
}
return 0.0
}
بعد از:
type User interface {
Discount() float64
}
type RegularUser struct{}
func (r RegularUser) Discount() float64 { return 0.1 }
type PremiumUser struct{}
func (p PremiumUser) Discount() float64 { return 0.2 }
type VIPUser struct{}
func (v VIPUser) Discount() float64 { return 0.3 }
func GetDiscount(user User) float64 {
return user.Discount()
}
این طراحی برای از بین بردن شرایط پیچیده ، باعث افزایش قابلیت حفظ کد می شود.
پایان
مدیریت پیچیدگی سیکلواتیک برای نوشتن کد GO حفظ و کارآمد بسیار مهم است. با درک و اندازه گیری این متریک ، توسعه دهندگان می توانند عملکردهای پیچیده ای را شناسایی کرده و استراتژی هایی را برای ساده سازی آنها به کار گیرند. استفاده از ابزارهایی مانند gocyclo
کمک در نظارت