النتائج 1 إلى 9 من 9

الموضوع: فكرة! في كتابة الجافا OOP ـ set, get أسهل عند إعادة إستخدام الكود

  1. #1
    التسجيل
    15-10-2004
    الدولة
    حائر
    المشاركات
    1,537

    فكرة! في كتابة الجافا OOP ـ set, get أسهل عند إعادة إستخدام الكود

    (هذا الموضوع يتكلم عن oop في لغة البرمجة Java (سي++ ولغات تدعم الoop أيضاً تنفع ربما!) إن لم تكن لك معرفة بهذين فلا أعتقد أن قراءة الموضوع ستفيدك)
    الفكرة وما فيها هي وضع طريقة أفضل وأكثر عملية للبرمجة الكائنية وخصوصاً الـSetter والـGetter للفئات.
    (تحتاج لفهم هذا دراسة أساسيات لغة الجافا أو أي لغة برمجة تدعم oop وكذلك دراسة البرمجة الكائنية OOP بها، إن لم تكن كذلك فلا تقرأ المقال!).

    ربما كما درست فإن مبرمجي الجافا يفضلون وضع Setter وGetter لكل خاصية(Properties) في الصنف بدلاً من ترك الخاصية public للسيطرة عليها في حال طرأ تغيير عليها. وهي طريقة جداً جملية حيث بها تضمن قلة الأخطاء إلى أدنى حد ممكن. خصوصاً إذا كنت مطور مكتبات (Programming Libraries) أو مطور SDK ولو كانت صغيرة. سترى أن هذا الأمر مهم جداً للسيطرة على الكود وإدراته وإستخدام ميزات oop بأفضل وجه (تابع قراءة المقال).

    لكن الطريقة العادية في وضع الـSetter, Getter طريقة سيئة برأيي. وندرسها نحن في مقرر الـJava-oop كطلاب علم الحاسوب.

    مثلاً someDot هو كائن من الصنف Dot3D لديه ثلاث خواص هم x, y, z يمثلون موقع النقطة في مستوى الأحداثيات.
    لو أردنا التحكم بالخواص من خلال وضع Setter, Getter لكل واحدة سنقوم بوضع الـMethods كما نعرف وكالمعتاد سنعرف الصنف وسينتج كائن someDot قابلاً للإستخدام كالتالي:
    كود:
    // Set values
    someDot.setX(10);
    someDot.setY(13);
    someDot.setZ(48);
    
    // Print them
    System.out.println("X: " + someDot.getX()
    + ", Y: " + someDot.getY() + ", Z: " + someDot.getZ() );
    ألا ترى ان هذه العملية مزعجة؟ أن تقوم بإسناد القيم لكل خاصية بواسطة Setter مستقل؟ ماذا لو كان هناك Setter يعمل بصورة متفاعلة بحيث تعطيه الخاصية وقيمتها أو الخواص وقيمهم، وبدون ترتيب إجباري؟ أو عدد معين من الخواص؟؟ هل تريد طريقة تختصر عليك الكتابة بأفضل وجه؟ وبكود مفهوم؟ هذا ما فعلته!

    أنظر هذا الكود، وتعلم كيف ستستطيع وبكل سهولة الحصول على واحد مثله بيدك!، لاحظ الشرح بعد الكود:

    كود:
    someDot.x(10);
    int num = someDot.x();
    هنا وضعنا قيمة لكل من x, y. بواسطة Setter سهل التذكر! وكذلك إملائياً سهل أن تفهم ماهو!

    كود:
    someDot.x(20).y(120);
    هل رأيت هذا الكود! أليس أجمل؟ إسندنا القيم لكليهما في نفس الأمر!

    كود:
    someDot.z(10).x(24).y(10).x(20);
    وهذا! بعد! هل رأيت تغيير أربع قيم! من ضمنها القيمة س مرتين، لا يوجد ترتيب إجباري ولا عدد معين من المرات للتغيير.

    ربما تفكر الآن وكيف نأخذ القيم بواسطة Getter وبنفس السهولة؟؟ شاهد الأكواد التالية وأنظر الشرح بعد كل واحد:
    كود:
    int a = someDot.x();
    الفرق بينهما أن عند إسناد قيمة يجب أن تمررها داخل الطريق (ميثود)ـ
    أما عند طلب الحصول على القيمة ببساطة! لا تمرر وسيط (parameter) وتحصل على القيمة الحالية لها!

    كود:
    int num = someDot.x(20).y(50).z();
    نستطيع المزج في الأمر الواحد بين عدة مسندات (setter) وفي النهاية محصل واحد (getter)
    في هذه الحالة نحن نسند قيمة لكل من x، y وبعدها نأخذ قيمة z ونضعها في المتغير (num)

    هذه الفكرة لوجه الله أضعها لكم كي تستفيدوا منها . وملاحظة، هذه الطريقة متبعة في بعض المكتبات مثل jQuery، مع أنها ليست في لغة جافا لكن لا بأس أن نتعلم منهم.

    هل رأيت؟ ما رأيك بالفكرة؟؟ حمل الكود الكامل الكود الكامل لكيفية عمل ذلك!

    هذا الكود، المطلوب أن تفهمه أنني علمت نفس الطريق (Method) لكل خاصية بنفس الإسم. يعين الخاصية أسميها (pX) وإسم الطريقين (Method) هما x الأول وهو Getter ومن نوع القيمة التي يضعها مثل int, char, double أو أي كان!. والثاني وهو الـ Setter وهو من نوع الكائن نفسه حيث أنه يحتوي على جملة Return ترجع نفس الكائن بواسطة this. وكذلك يسند القيمة الممررة إليه إلى الخاصية (Properties) المطلوبة وفي هذه الحالة x.

    في هذه الحالة يجب أن تعلم أنني عملت Overload لكل طريق (Method) مرتين الأول بشكل Setter والثاني Getter!
    الكود موجود بالمرفقات
    (الكود هنا ملون لكن إن اردت الكود كاملاً بشكل ملف جافا حمله وإفتحه بمحررك المفضل مثل Eclipse, NetBeans, NotePadpp
    كود:
    /*
        Better OOP by making cleaner Setter, Getter!
        For eazier programming.
    
        Copyright (C) 2009  Omar Al-Dolaimy (http://www.omardo.com)
    
        This program is free software: you can redistribute it and/or modify
        it under the terms of the GNU General Public License as published by
        the Free Software Foundation, either version 3 of the License, or
        (at your option) any later version.
    
        This program is distributed in the hope that it will be useful,
        but WITHOUT ANY WARRANTY; without even the implied warranty of
        MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
        GNU General Public License for more details.
    
        You should have received a copy of the GNU General Public License
        along with this program.  If not, see <http://www.gnu.org/licenses/>.
    */
    
    import java.util.*;
    
    public class ReturnThis {
    	public static void main (String args[]) {
    		Scanner scan = new Scanner( System.in );
    //		تعريف الكائن
    		Dot3D someDot = new Dot3D();
    
    //		SETTERS
    //		 إسناد قيمة س، ص بالطريقة المختصرة
    //c            وهي أشبه بالطريقة القديمة لحد الآن 		
    		someDot.x(10);
    		someDot.y(20);
    
    //		أنظر هذا الإختصار أليس أفضل؟
    		someDot.x(20).y(120);
    
    //		أو هذا
    		someDot.z(10).x(24).y(10).x(20);
    
    //		وأنظر الآن جمال الفكرة! أن 
    //		 Setter looks like getter!
    //			GETTERS!
    		int a = someDot.x();
    /*
    //		الفرق بينهما أن عند إسناد قيمة
    يجب أن تمررها داخل الطريق (ميثود)ـ             //
     	أما عند طلب الحصول على القيمة ببساطة!       	//
    لا تمرر وسيط (بارميتير) وتحصل على القيمة الحالية لها //
    
    // 		Getters After Setter!
    // 		تستطيع المزج في الأمر الواحد بين عدة
                    مسندات (سيتير)
     وفي النهاية محصل واحد (كيتر) أنظر التالي:
    */
    		int num = someDot.x(20).y(50).z();
    //		في هذه الحالة نحن نسند قيمة لكل
    من س، ص وبعدها نأخذ قيمة ع ونضعها في المتغير (نام)ـ            //
    
    // 		هذا مثال لطباعة قيم س، ص، ع للكائن. الكود
    // نظيف وبسيط وواضح!
    
    		System.out.println("X: " + someDot.x() + ", Y: " 
          + someDot.y() + ", Z: " + someDot.z() );
    	}
    }
    
    class Dot3D {
    	// Properties || Dimentions
    	private int pX=0, pY=0, pZ=0;
    
    	// Setter's
    	public Dot3D x(int val) {
    		pX = val;
    		return this;
    	}
    
    	public Dot3D y(int val) {
    		pY = val;
    		return this;
    	}
    
    	public Dot3D z(int val) {
    		pZ = val;
    		return this;
    	}
    
    	// Getter's
    	public int x() {
    		return pX;
    	}
    
    	public int y() {
    		return pY;
    	}
    
    	public int z() {
    		return pZ;
    	}
    
    }
    
    /*
    // OLD WAY TO SET, GET!
    // Set values
    someDot.setX(10);
    someDot.setY(13);
    someDot.setZ(48);
    
    // Print them
    System.out.println("X: " + someDot.getX() + ", Y: "
                        + someDot.getY() + ", Z: " + someDot.getZ() ); 
    
    */
    الكود نفسه موجود بالمرفقات
    (مصدر المقال الأصلي من هنا, في حال أردت أن تتابع تحديثات المقال)
    الملفات المرفقة الملفات المرفقة
    جديد موقعي .


    رابط الصفحة .. من هنا:
    من المدونة [هنا]


  2. #2
    التسجيل
    23-12-2004
    الدولة
    AD
    المشاركات
    4,350

    رد: فكرة! في كتابة الجافا OOP ـ set, get أسهل عند إعادة إستخدام الكود

    رهيبة الحركة !

    فيه شي ما فهمته
    كود:
    public Dot3D x(int val) {
            pX = val;
            return this;
        }

    return this;
    this هنا شو راح تعطينا بالضبط ؟
    اللي فاهمته انها Int وهي فعلا راح ترجع int لأنه بالمين ميثود قدرنا نخزن قيمتها
    بـ int num
    لكن بالميثود هنا يقول انه نوع القيمة اللي بترجعها الميثود Dot3D ... منطقي مع this بس شلون !
    طيب بطريقة أوضح ليش ما قلناreturn Dot3D.pX ؟؟

    ...
    اممم شي ثاني ... على هالطريقة السيتر فوق وطيفتها تقدر تكون قيتر بنفس الوقت لأنها قاعدة تخزن قيمة وقاعدة ترجعها بعد ؟ صح ولا أنا غلطانه -_-

    << اعذرها من الصدمة ... أول مرة تشوف سيتر و مش void ><'
    <

    يعطيك العافية على موضوعك المفيد جداً ... (:

  3. #3
    التسجيل
    03-08-2004
    الدولة
    تركيا
    المشاركات
    3,755

    رد: فكرة! في كتابة الجافا OOP ـ set, get أسهل عند إعادة إستخدام الكود

    السلام عليكم

    هلو عمر .... موضوع فورا الى قسم التميز

  4. #4
    التسجيل
    15-10-2004
    الدولة
    حائر
    المشاركات
    1,537

    رد: فكرة! في كتابة الجافا OOP ـ set, get أسهل عند إعادة إستخدام الكود

    وأخيراً واحد فهم علي ويبي يسأل ^^

    مراقبة منتدى النثر و الخواطر
    !
    return this;
    this هنا شو راح تعطينا بالضبط ؟
    هذي تعطيني Reference للأوبجكت نفسه مرة أخرى!
    هذه كلمة محجوزة تشير إلى الObject داخله .

    يعين أنا أخلي الميثود سيتر يرجع نفس الأوبجكت بدلاً من إرجاع void أو أي قيمة أخرى!
    عشان نقدر نستخدم الأوبجكت مرة أخرى بدون الحاجة لإعادة ندائه في أمر منفصل لتغيير خاصية أخرى.
    --------------
    طيب بطريقة أوضح ليش ما قلناreturn Dot3D.pX ؟؟
    إحنا بدنا نرجع الأوبجكت نفسه! مو الخاصية. يعني كلما نسوي Set نرجع نقدر نستخدم الأوبجكت مرة أخرى سواء بنداء ميثود آخر أو إخذ قيمة خاصية.

    اممم شي ثاني ... على هالطريقة السيتر فوق وطيفتها تقدر تكون قيتر بنفس الوقت لأنها قاعدة تخزن قيمة وقاعدة ترجعها بعد ؟ صح ولا أنا غلطانه -_-
    لاء، السيتر والقيتر متشابهات في الإسم فقط لكنهم يختلفون في نوع الParmeters وهذا يسمى Overload (نفس الإسم لأكثر من ميثود).

    << اعذرها من الصدمة ... أول مرة تشوف سيتر و مش void ><'
    عيشي وشوفي!

    يعطيك العافية على موضوعك المفيد جداً ... (:
    الله يعافيج

    --------------
    حسام: تسلم ^^، شوكت تتعلم oop؟ حرامات تفوت هيج شيء يخبل!
    جديد موقعي .


    رابط الصفحة .. من هنا:
    من المدونة [هنا]


  5. #5
    التسجيل
    29-11-2004
    الدولة
    ♥ والله أحبك يا قطر ♥
    المشاركات
    6,985

    رد: فكرة! في كتابة الجافا OOP ـ set, get أسهل عند إعادة إستخدام الكود

    السلام عليكم,, لووووول ما فهمت شي .. بس أعجبني ان "الاختراع" عربي ..

    الله يوفقك يا عمر ^_^ ... بس كما تعرني انا وال جافا ما نتفاهم

    شجون العين : شخبارج.. ان شاء الله بخير P: .. بس فهمينا ما فهمت شي P:

    Arganaut : .. يا حيه مراقب البرمجيات ..... افخاطري اشوف اخر برامجك ..

  6. #6
    التسجيل
    23-12-2004
    الدولة
    AD
    المشاركات
    4,350

    رد: فكرة! في كتابة الجافا OOP ـ set, get أسهل عند إعادة إستخدام الكود

    اقتباس المشاركة الأصلية كتبت بواسطة عمر مشاهدة المشاركة
    يعين أنا أخلي الميثود سيتر يرجع نفس الأوبجكت بدلاً من إرجاع void أو أي قيمة أخرى!
    عشان نقدر نستخدم الأوبجكت مرة أخرى بدون الحاجة لإعادة ندائه في أمر منفصل لتغيير خاصية أخرى.
    --------------
    إحنا بدنا نرجع الأوبجكت نفسه! مو الخاصية. يعني كلما نسوي Set نرجع نقدر نستخدم الأوبجكت مرة أخرى سواء بنداء ميثود آخر أو إخذ قيمة خاصية.
    جننت فيك مو ؟
    والله قمة الوناسة يوم فهمتها ... رجعت قريت الكود كذا مرة و فتحت المقالة في الموقع وقريتها كاملة من جديد وفهمت على طوول (ترى فيه اختلافات بالمقالة)


    لاء، السيتر والقيتر متشابهات في الإسم فقط لكنهم يختلفون في نوع الParmeters وهذا يسمى Overload (نفس الإسم لأكثر من ميثود).
    هذي بعد ما كنت مستوعبتها P:

    لا خلاص ألحين كلهم وضحوا تمام ^^
    يعطيك العافية يارب ... و عساك ع القوة (:

    ...
    إزبك : هلا بك ... أنا بخير ^^
    يحليلي أنا اللي أباك تفهمني
    نشوفك على خير (:

  7. #7
    التسجيل
    03-08-2004
    الدولة
    تركيا
    المشاركات
    3,755

    رد: فكرة! في كتابة الجافا OOP ـ set, get أسهل عند إعادة إستخدام الكود

    تسلم ^^، شوكت تتعلم oop؟ حرامات تفوت هيج شيء يخبل
    ان شاء الله بس اكمل دراستي حول الانظمة بعد 3 سنين
    يا حيه مراقب البرمجيات ..... افخاطري اشوف اخر برامجك
    هلا والله بالزين و الرائع والغالي والطيب والقوي و الجميل و المفكر عبودي ، كيف حالك ان شاء الله بخير ، والله حاليا كل نشاطي الى ABCnux القادم تحت تسمية جديدة يمكن سوف انشره 2009-8-x يعني عندي الكثير من الاعمال و من الله المستعان

  8. #8
    التسجيل
    15-10-2004
    الدولة
    حائر
    المشاركات
    1,537

    رد: فكرة! في كتابة الجافا OOP ـ set, get أسهل عند إعادة إستخدام الكود

    شجون العين: يمكن إنت الوحيدة اللي فهمتيها . للحين ما حد أبدى تفاعل معها!
    أتوقع بسبب العزوف عن تعلم oop للمبرمجين العرب.

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


    رابط الصفحة .. من هنا:
    من المدونة [هنا]


  9. #9
    التسجيل
    29-11-2004
    الدولة
    ♥ والله أحبك يا قطر ♥
    المشاركات
    6,985

    رد: فكرة! في كتابة الجافا OOP ـ set, get أسهل عند إعادة إستخدام الكود

    ^
    ^

    خلني اتعلم 1 واتقنهــا وبعدين يصير خير إن شاء الله

ضوابط المشاركة

  • لا تستطيع إضافة مواضيع جديدة
  • لا تستطيع الرد على المواضيع
  • لا تستطيع إرفاق ملفات
  • لا تستطيع تعديل مشاركاتك
  •