Back home

أنماط التصميم من خلال البرامج التعليمية - قوة OOP (الجزء 3)

نمط المحول في نمط محول Swift Swift

أنماط التصميم من خلال البرامج التعليمية - قوة OOP (الجزء 3)

المتطلبات الأساسية - تتطلب سلسلة الدروس هذه مستوى متوسطًا من الخبرة في البرمجة الموجهة للكائنات. يجب أن تكون لديك معرفة أساسية بالفئة والكائن والمنشئ والميراث والقيمة ونوع المرجع. سوف يكتسب الوسيط المعرفة وسيقوم الخبراء بصقل معرفتهم من خلال قراءة هذه السلسلة من البداية إلى النهاية. المتطلبات الأساسية—تتطلب سلسلة البرامج التعليمية هذه خبرة متوسطة في البرمجة الموجهة للكائنات. يجب أن يكون لديك فهم أساسي للفئات والكائنات والمنشئات والميراث والقيمة وأنواع المراجع. سيكتسب المستخدمون المتوسطون المعرفة، بينما سيعمل الخبراء على تحسين معرفتهم من خلال قراءة هذه السلسلة من الغلاف إلى الغلاف.

ما هو المحول؟

ما هو المحول؟

المحول هو جهاز مادي يسمح بتكييف أحد الأجهزة أو الواجهة الإلكترونية مع جهاز آخر أو واجهة إلكترونية دون فقدان الوظيفة. المحول هو جهاز مادي يسمح بتكييف أحد الأجهزة أو الواجهة الإلكترونية مع جهاز آخر أو واجهة إلكترونية دون فقدان الوظيفة.

يتم استخدام المحولات عندما يكون لديك نموذج واحد من الإدخال وتريد الوصول إلى شيء لا يمكنه قبول نموذج الإدخال الخاص بك. يتم استخدام المحولات عندما يكون لديك نموذج من المدخلات وترغب في الوصول إلى شيء لا يمكن أن يأخذ شكل المدخلات الخاصة بك.

حان الوقت الآن لفهم نمط المحول من خلال الإجابة على الأسئلة البسيطة أدناه. الآن، افهم نمط المحول من خلال الإجابة على الأسئلة البسيطة أدناه.

  1. ما هو نمط المحول في البرمجة الشيئية؟ ما هو نمط المحول في البرمجة الموجهة للكائنات؟

  2. ما هي المشكلة التي يحلها؟ ما هي المشكلة التي يحلها؟

  3. كيف يمكننا استخدامه في البرمجة؟ وكيف نستخدمه في البرمجة؟

ما هو نمط المحول في البرمجة كائنية التوجه؟

ما هو نمط المحول في البرمجة الشيئية؟

في نمط المحول، نحدد فئة واحدة تأخذ النوع الحالي كمدخل وتمنحنا النوع المطلوب أو الوظيفة/الخصائص المطلوبة للوصول إليها. في نمط المحول، نحدد فئة تقبل نوعًا موجودًا كمدخل وتمنحنا النوع المطلوب أو الوظيفة/الخصائص المطلوبة للوصول إليها.

ما هي المشكلة التي يحلها؟

ما هي المشكلة التي يحلها؟

فهو يساعد على تحويل أنواع البيانات الموجودة إلى شكل آخر من البيانات. يساعد في تحويل نوع البيانات الحالي إلى شكل آخر من البيانات.

يعد هذا مفيدًا جدًا عندما نستخدم تعليمات برمجية لأطر عمل أو مكتبة تابعة لجهات خارجية ويقبل الأنواع المقيدة فقط. يعد هذا مفيدًا جدًا عندما نستخدم تعليمات برمجية من إطار عمل أو مكتبة تابعة لجهة خارجية ولا يقبل إلا الأنواع المقيدة.

كيف يمكننا استخدامه في البرمجة؟

وكيف نستخدمه في البرمجة؟

دعونا نفهم هذا مع المثال أدناه. دعونا نفهم ذلك من خلال المثال التالي.

لدينا فئات مثل Point و LineSegment و DrawingPad . لدينا فئات Point وLineSegment وDrawingPad.

هل تتذكر أيام مدرستنا القديمة لرسومات الكمبيوتر باستخدام لغة C؟ هل تتذكر الأيام التي استخدمنا فيها لغة C للقيام بالرسومات الحاسوبية؟ في ذلك الوقت، فقط لرسم خط على الشاشة، علينا حساب جميع نقاط الخط الفاصل بين نقطتين محددتين. لحساب نقاط الخط، هناك العديد من الخوارزميات الأساسية المتاحة مثل خوارزمية رسم الخطوط البسيطة، وخوارزمية DDA، وخوارزمية خط بريسنهام وما إلى ذلك. لكي نرسم خطًا على الشاشة، نحتاج إلى حساب جميع النقاط الواقعة بين نقطتين على هذا الخط. من أجل حساب نقاط الخط المستقيم، هناك العديد من الخوارزميات الأساسية التي يمكن استخدامها، مثل خوارزمية رسم الخط المستقيم البسيط، وخوارزمية DDA، وخوارزمية الخط المستقيم Bresenham، وما إلى ذلك. سنحافظ على رمز المثال الخاص بنا نظيفًا وسهل الفهم لنمط المحول دون كتابة هذه الخوارزميات المعقدة هنا. بالنسبة لنمط المحول، سنبقي رمز المثال بسيطًا وسهل الفهم دون كتابة مثل هذه الخوارزميات المعقدة هنا.

// Hitendra Solanki
// Adapter design pattern Playground example
import Foundation

class Point {
    var x: Int
    var y: Int
    
    init(x: Int, y: Int) {
        self.x = x
        self.y = y
    }
}

class LineSegment {
    var startPoint: Point
    var endPoint:   Point
    
    init(startPoint: Point, endPoint: Point) {
        self.startPoint = startPoint
        self.endPoint = endPoint
    }
}

//Mark:- DrawingPad
//  This is just to make example more interesting
//  We are just printing the point on Console to make it simple
class DrawingPad {
    //Draw Single point, main drawing method
    func draw(point: Point) {
        print(".")
    }
    
    //Draw multiple points
    func draw(points: [Point]) {
        points.forEach { (point) in
            self.draw(point: point)
        }
    }
}



func main(){
    let drawingPad = DrawingPad()
    
    let point1 = Point(x: 10, y: 10)
    
    drawingPad.draw(point: point1)
}

//call main function to execute code
main()


// AdapterPattern_intro.swift 

في المثال أعلاه

في المثال أعلاه

السطر 6، الفئة النقطة تمثل نقطة واحدة. السطر 6، الفئة نقطة تمثل نقطة.

السطر 16، الفئة LineSegment تمثل قطعة خط. السطر 16، الفئة LineSegment تمثل قطعة خط.

السطر 29، الفئةDrawingPad تمثل لوحة قماشية للرسم. يمكن لـ DrawPad رسم نقاط مفردة أو متعددة على اللوحة القماشية. السطر 29، فئة DrawingPad تمثل لوحة قماشية تستخدم للرسم. يمكن لـ DrawPad رسم نقاط مفردة أو متعددة على اللوحة القماشية.

يمكننا رسم نقطة في هذا المثال ولكن لا يمكننا رسم مقطع خطي مباشرة على اللوحة القماشية باستخدام مثيل لوحة الرسم. وهنا يأتي نمط المحول في حالة إنقاذ، وذلك بفضل نمط المحول. يمكننا رسم نقطة في هذا المثال، لكن لا يمكننا رسم مقطع خطي مباشرة على اللوحة القماشية باستخدام مثيل اللوحة الفنية. هنا، يأتي دور نمط المحول، وذلك بفضل نمط المحول.

// Hitendra Solanki
// Adapter design pattern Playground example
import Foundation

class Point {
    var x: Int
    var y: Int
    
    init(x: Int, y: Int) {
        self.x = x
        self.y = y
    }
}

class LineSegment {
    var startPoint: Point
    var endPoint:   Point
    
    init(startPoint: Point, endPoint: Point) {
        self.startPoint = startPoint
        self.endPoint = endPoint
    }
}

//Mark:- DrawingPad
//  This is just to make example more interesting
//  We are just printing the point on Console to make it simple
class DrawingPad {
    //Draw Single point, main drawing method
    func draw(point: Point) {
        print(".")
    }
    
    //Draw multiple points
    func draw(points: [Point]) {
        points.forEach { (point) in
            self.draw(point: point)
        }
    }
}

//Mark: LineSegmentToPointAdapter
//  This is responsible to generate all points exists on LineSegment
class LineSegmentToPointAdapter {
    var lineSegment: LineSegment
    init(lineSegment: LineSegment) {
        self.lineSegment = lineSegment
    }
    func points() -> Array<Point> {
        //To make things simple, without complex line drawing algorithms,
        //This will only work for points like below
        //(10,10) to (20,20)
        //(34,34) to (89,89)
        //(x,y) to (p,q) where y=x and q=p i.e. (x,x) to (p,p) just to make it simple for this demo
        
        var points: Array<Point> = []
        let zipXY = zip(
            (self.lineSegment.startPoint.x...self.lineSegment.endPoint.x),
            (self.lineSegment.startPoint.y...self.lineSegment.endPoint.y)
        )
        for (x,y) in zipXY {
            let newPoint = Point(x: x, y: y)
            points.append(newPoint)
        }
        return points
    }
    
}




func main(){
    let drawingPad = DrawingPad()
    
    //Remeber: (x,y) to (p,q) where y=x and q=p => (x,x) to (p,p) for our points logic to work
    
    //create lineSegment
    let startPoint = Point(x: 2, y: 2)
    let endPoint = Point(x: 10, y: 10)
    let lineSegment = LineSegment(startPoint: startPoint, endPoint: endPoint)
    
    //create adapter
    let adapter = LineSegmentToPointAdapter(lineSegment: lineSegment)
    
    //get points from adapter to draw
    let points = adapter.points()
    
    drawingPad.draw(points: points) //it will draw total 9 dots on console
}

//call main function to execute code
main()

//AdapterPattern_simpleSolution.swift

Line45، فئة LineSegmentToPointAdapter تمثل محولًا وهو المفهوم الأساسي لهذه المقالة. يأخذ النوع الحالي LineSegment كمدخل ويعطينا مجموعة من النقاط في حالتنا. Line45، فئة Linesegmenttopadapter تمثل محولًا، وهو المفهوم الأساسي لهذه المقالة. يأخذ كمدخل نوع LineSegment الموجود ويعطينا مجموعة من النقاط في هذه الحالة.

###الخلاصة الاستنتاج

  1. المحول هو أي فئة تأخذ كائنًا واحدًا كمعلمة في المُنشئ. المحول هو أي فئة تقبل كائنًا كمعلمة في مُنشئه.

  2. تحتوي فئة المحول على خصائص/طرق يمكننا استخدامها كنوع مطلوب. تحتوي فئة المحول على خصائص/طرق يمكن استخدامها كنوع مطلوب.

  3. يمكن للمحول أيضًا أن يعمل بشكل مباشر على النوع المطلوب، والذي يعتمد على التنفيذ. يمكن للمحولات أيضًا تشغيل النوع المطلوب مباشرةً، اعتمادًا على التنفيذ.هذا مجرد تطبيق بسيط لنمط المحول في البرمجة الموجهة للكائنات باستخدام Swift. ولكن مهلا، هناك شيء أكثر تقدما في هذا النمط. هذا مجرد تطبيق بسيط لنمط المحول في البرمجة الموجهة للكائنات باستخدام Swift. لكن مهلا، هناك الكثير من الأشياء والتقدم في هذا الوضع.

يعد نمط تصميم المحول أكثر قوة مع…. يعد نمط تصميم المحول أكثر قوة …

المزيد من المحتوى قريبا… المزيد قريبا…

انقر لعرض النص الأصلي: https://medium.com/flawless-app-stories/adapter-pattern-design-patterns-by-tutorials-the-power-of-oop-part-3-112a956c1101