1. اٹیرٹر پیٹرن کیا ہے
اٹیرٹر پیٹرن ایک برتائی کے ڈیزائن پیٹرن ہے جو ایک ایگری گیٹ آبجیکٹ کے عناصر کو چھپانے بغیر ایگری گیٹ آبجیکٹ کے اندرونی تصور کو دور کرنے کا ایک معیاری طریقہ فراہم کرتا ہے۔
2. اٹیرٹر پیٹرن کی خصوصیات اور فوائد
اٹیرٹر پیٹرن کی خصوصیات اور فوائد مندرجہ ذیل ہیں:
- یہ کلیکشن آبجیکٹ کی اندرونی ساخت کو چھپا سکتا ہے، سیکل کرنے کا الگارتھم کلیکشن آبجیکٹ سے الگ کر دیتا ہے۔
- یہ مختلف قسم کے کلیکشن آبجیکٹس کو چھپنا کلیکرن کا معیاری طریقہ فراہم کرتا ہے۔
- یہ کلائنٹ کوڈ کو آسان اور مختصر بناتا ہے۔
- یہ مختلف اٹیریٹرز کی امکان بھی فراہم کرسکتا ہے تاکہ مختلف عبارتوں کی ضرورت کو پورا کر سکے۔
3. عملی استعمال کے مثالیں اٹیرٹر پیٹرن کی
اٹیرٹر پیٹرن کا مختلف عملی استعمال ممکن ہیں، جیسے:
- ڈیٹا بیس کی کوئیری کے نتائج کو چھپانا۔
- فائل سسٹم میں فائل اور فولڈر کا سیکل کرنا۔
- کلیکشن میں المنٹس کو چھپانا۔
4. اٹیرٹر پیٹرن کی گولانگ میں تنسیل
4.1 UML کلاس شکل
4.2 نمونہ کا تعارف
UML کلاس شکل میں، ہمارے پاس دو اہم کردار ہیں: اٹیرٹر اور کلیکشن۔
- اٹیریٹر کلیکشن آبجیکٹ کے سیکل کرنے کے انٹرفیس کی تعریف کرتا ہے، جس میں
HasNext()
میتھڈ شامل ہوتا ہے تاکہ یہ تعین کر سکیں کہ کیا دوسرا عنصر موجود ہے اورNext()
میتھڈ تاکہ اگلا عنصر حاصل کیا جاسکے۔ - کنکریٹ اٹیریٹر اے ایک اٹیریٹر کے معین مخصوص تصورہ کلاس ہے، جو
HasNext()
اورNext()
میتھڈ کی سپیسفک تصور کرتا ہے۔ - کلیکشن ایک انٹرفیس کی تعریف کرتا ہے جو اٹیریٹر آبجیکٹس بنانے کیلئے ہوتا ہے، جس میں
CreateIterator()
میتھڈ شامل ہوتا ہے۔ - کنکریٹ کلیکشن ایک کلیکشن کے مخصوص تصورہ کلاس ہے، جو
CreateIterator()
میتھڈ کو سپیسفک کرتا ہے۔
4.3 تنسیل کے اقدامات
اگلے، ہم گولانگ میں اٹیرٹر پیٹرن کی تنسیل کا قدم با قدم تنضی کریں گے۔
4.3.1 اٹیریٹر انٹرفیس اور کنکریٹ اٹیریٹر کلاس کی تعریف
type Iterator interface {
HasNext() bool
Next() interface{}
}
type ConcreteIterator struct {
collection *ConcreteCollection
index int
}
func (it *ConcreteIterator) HasNext() bool {
if it.index < len(it.collection.items) {
return true
}
return false
}
func (it *ConcreteIterator) Next() interface{} {
if it.HasNext() {
item := it.collection.items[it.index]
it.index++
return item
}
return nil
}
4.3.2 قابل سیکل آبجیکٹ انٹرفیس اور کنکریٹ قابل سیکل آبجیکٹ کلاس کی تعریف
type Collection interface {
CreateIterator() Iterator
}
type ConcreteCollection struct {
items []interface{}
}
func (c *ConcreteCollection) CreateIterator() Iterator {
return &ConcreteIterator{
collection: c,
index: 0,
}
}
4.3.3 انٹریٹر پیدا کرنے کی منطق کی پیادش کرنا
func main() {
collection := &ConcreteCollection{
items: []interface{}{"Golang", "Python", "Java"},
}
iterator := collection.CreateIterator()
for iterator.HasNext() {
item := iterator.Next()
fmt.Println(item)
}
}
اوپر دئیے گئے کوڈ کو چلانے سے مندرجہ ذیل نتیجہ نکلتا ہے:
Golang
Python
Java
اوپر دئیے گئے کوڈ میں ہم نے ConcreteCollection
کلاس کو تعریف کیا ہے جو Collection
انٹرفیس کو پورا کرتا ہے، اور اس کے CreateIterator()
میتھڈ میں ایک اٹیریٹر آبجیکٹ واپس کرتا ہے۔ہم نے اس اٹیریٹر آبجیکٹ کو main()
فنکشن میں استعمال کیا ہے سیکل کرنے کے لیے۔
4.4 نافذہ کاری مرحلہ توسیع: جنریٹر فنکشن کا استعمال کرکے آٹارکاری کی نافذہ کاری کو آسان بنانا
Golang میں ہم جنریٹر فنکشن (yield
) کا استعمال کرکے آٹارکاری کی نافذہ کاری کو آسان بنا سکتے ہیں. یہاں ایک جنریٹر فنکشن کا استعمال کا مثال ہے:
func GenerateItems() <-chan interface{} {
items := []interface{}{"Golang", "Python", "Java"}
out := make(chan interface{})
go func() {
defer close(out)
for _, item := range items {
out <- item
}
}()
return out
}
func main() {
for item := range GenerateItems() {
fmt.Println(item)
}
}
اوپر دی گئی کوڈ میں ہم نے GenerateItems()
فنکشن کا تعریف کی ہے جو ایک پڑھنے کے لئے چینل (<-chan
) واپس کرتا ہے، اور اس فنکشن کے اندر یہ yield
استعمال کرکے عناصر کو چینل میں مسلسل بھیجنے کا استعمال کیا ہے. main()
فنکشن میں ہم نے range
کا استعمال کرکے اس پڑھنے کے لئے چینل میں چلنے اور عناصر کی قیمتیں نکالنے کا استعمال کیا ہے.
اس طرح، ہم نے جنریٹر فنکشن کا استعمال کرکے آٹارکاری کی نافذہ کاری کو آسان بنا دیا ہے۔