Go:
রিফ্যাক্টরিং
কিভাবে:
ইন গো, রিফ্যাক্টরিং সাধারণ কোড টুইকস থেকে আরও জটিল পরিবর্তনে পরিবর্তিত হতে পারে। একটি মৌলিক উদাহরণ দিয়ে শুরু করা যাক: ভালো পঠনযোগ্যতা এবং দক্ষতার জন্য একটি প্রাথমিক গো ফাংশন সরলীকরণ।
রিফ্যাক্টরিং আগে:
package main
import "fmt"
func CalculatePrice(quantity int, price float64) float64 {
var total float64
if quantity > 0 {
total = float64(quantity) * price
} else {
total = 0
}
return total
}
func main() {
fmt.Println(CalculatePrice(10, 5.99)) // আউটপুট: 59.9
}
রিফ্যাক্টরিং পরে:
package main
import "fmt"
func CalculatePrice(quantity int, price float64) float64 {
if quantity > 0 {
return float64(quantity) * price
}
return 0
}
func main() {
fmt.Println(CalculatePrice(10, 5.99)) // আউটপুট: 59.9
}
রির্ফাকটর করা সংস্করণে, else
অপসারণ করা হয়েছে, যা ফাংশনের প্রবাহকে সরলীকৃত করে কিন্তু এর আউটপুটকে প্রভাবিত করে না—গোতে একটি মৌলিক তবে প্রভাবশালী রিফ্যাক্টরিং কৌশলের উদাহরণ।
আরও উন্নত উদাহরণের জন্য, উন্নত পুন:ব্যবহার এবং পরীক্ষণের জন্য ইন্টারফেস ব্যবহার করে ফাংশনগুলিকে রির্ফাকটর করার কথা চিন্তা করুন:
রিফ্যাক্টরিং আগে:
package main
import "fmt"
type Logger struct{}
func (l Logger) Log(message string) {
fmt.Println("Log:", message)
}
func ProcessData(data string, logger Logger) {
// কল্পনা করুন এখানে কিছু ডেটা প্রসেসিং আছে
logger.Log("Data processed")
}
func main() {
logger := Logger{}
ProcessData("example data", logger)
}
রিফ্যাক্টরিং পরে:
package main
import "fmt"
type Logger interface {
Log(message string)
}
type ConsoleLogger struct{}
func (c ConsoleLogger) Log(message string) {
fmt.Println("Log:", message)
}
func ProcessData(data string, logger Logger) {
// ডাটা প্রসেসিং অপরিবর্তিত থাকে
logger.Log("Data processed")
}
func main() {
logger := ConsoleLogger{}
ProcessData("example data", logger)
}
একটি ইন্টারফেস (Logger
) ব্যবহার করার জন্য রির্ফাকটরিং, একটি ঠোস টাইপ (ConsoleLogger
) এর পরিবর্তে, ফাংশনের নমনীয়তা উন্নতি এবং নির্দিষ্ট লগিং বাস্তবায়ন থেকে ডেটা প্রসেসিংকে আলাদা করে।
গভীর ডুব
গোতে রির্ফাকটরিং সাদগ্রহণ (গোর মৌলিক দর্শন) এবং বৃহত্তর সফটওয়্যার প্রকল্পগুলিতে প্রয়োজনীয় নমনীয়তার মধ্যে একটি ভারসাম্য স্থাপন করতে হবে। জেনেরিক (সম্প্রতি পর্যন্ত) ছাড়াই এবং পঠনযোগ্যতার উপর জোর দিয়ে গোর সীমাবদ্ধ বৈশিষ্ট্য দৃষ্টিকোনের সাথে—ভাষাটি স্বাভাবিকভাবে ডেভেলপারদের সরল, আরও রখরখাজোগ্য কোড কাঠামোর দিকে পরিচালিত করে। তবে, এর মানে এই নয় যে গো কোড রিফ্যাক্টরিং থেকে উপকৃত হয় না; এর মানে হলো রির্ফাকটরিং সর্বদা স্পষ্টতা এবং সাদগ্রহণকে অগ্রাধিকার দেবে।
ঐতিহাসিকভাবে, গোর কিছু বৈশিষ্ট্যের অভাব (উদাহরণ স্বরূপ, গো 1.18 এর আগে জেনেরিক) কোড পুনঃব্যবহার এবং নমনীয়তার জন্য সৃজনশীল কিন্তু মাঝে মাঝে জটিল সমাধানের জন্য পরিচিত হয়েছিল, তাই অস্পষ্টতার জন্য রিফ্যাক্টরিং একটি সাধারণ অনুশীলন হয়ে উঠেছিল। গো 1.18 এ জেনেরিকের প্রবর্তনের সাথে, গো ডেভেলপাররা এখন টাইপ সুরক্ষা এবং কোড পুনঃব্যবহারের জন্য এই বৈশিষ্ট্যটি কাজে লাগাতে পুরানো কোডকে রির্ফাকটর করছেন, যা গোতে রিফ্যাক্টরিং অনুশীলনের বিবর্তনশীল প্রকৃতি দেখায়।
তবুও, গোর টুলসেট, যেমন gofmt
কোড ফরম্যাটিং এবং go vet
সন্দেহজনক নির্মাণাদি চিহ্নিত করার জন্য, পরিষ্কার কোডবেস রক্ষা করে, ব্যাপক রিফ্্্যাক্টরিংয়ের প্রয়োজন হ্রাস করে। যদিও রির্ফাকটরিং একজন গো প্রোগ্্্রামারের আর্সেনালে একটি মূল্যবান টুল, সঠিকভাবে গোর ভাষা বৈশিষ্ট্য এবং টুলগুলি ব্যবহার করা প্রাথমিকভাবে পরে জটিল রিফ্যাক্টরিংয়ের প্রয়োজনকে সর্বনিম্ন করতে সাহায্য করতে পারে।