تبسيط مفهوم الكلاس للغة الجافا بالتقريب الى الحياة


مستوى المقال: مبتدئ

السلام عليكم ورحمة الله وبركاتة

هذه مقالة مبسطة لشرح مفهوم الـ Class بلغة البرمجة الـ Java لكل من يعاني من صعوبة في فهمها. فمن مدة قمت بكتابة مقاله مشابهه لها لتقريب مفهوم الكلاس بالبايثون في احدى المواقع الانجليزيه وقد نالت على الاعجاب, فأحببت ان اكتب مقاله تخدم نفس الهدف ولكن باللغة العربية وبلغة البرمجة الاكثر عمقاً وهي الجافا. الشرح مناسب لكل الاعمار, يستخدم الطريقة المشهورة في تبسيط الامور وهي: explain like I'm five, اي اشرحها لي كأني طفل او مبتدئ. فأرى ان كل شخص يريد تعلم شئ جديد يفوق مستواه الحالي في الفهم, في البداية يجب عليه ان يتواضع ويحاول فهمها كانه يملك دماغ طفل! بعيداً عن الغطرسة والمصطلحات المعقدة والتي بدورها تصعب الامور.

 

unnamed.thumb.jpg.ffdd879eb8c9e78aeaf2d2d612d0c7d9.jpg

هذه الصوره لـ ام وابنتها ونرى مدى تشابههم مع بعضهم البعض, وكأنهم يمثلون Class و Object.

 

شرح مفهوم الكلاس بشكل تقريبي للحياة الطبيعية

سيكون الشرح على شكل نقاط حتى يسهل الفهم, وستكون الامثله تقريبيه للحياه الطبيعيه لتسهيل الفهم فقط لاغير. وتستطيع قرائة هذه المقاله اكثر من مره والرجوع لها اذا واجهت مصطلح غامض اثناء تعلمك البرمجة بلغة الجافا. وان شاء الله سوف تنير لك طريقك.

  • الـ Class تمثل في الحقيقة امك.
  • الـ Object هو انت. و Object اخر يعتبر اختك او اخاك. ونستطيع تسميتكم بـ Instances of the class. اي اولاد ملكيتكم ترجع الى امكم.
  • الـ Class Constructor تستطيع القول انه الرحم الذي سوف تتكون بداخله انت وجيناتك.
  • الـ Declaration وهي عملية تحديد الـ Variables قبل استخدامها, اي تصريح الام بقيمها التي تتدخل في جيناتك و عملية ولادتك.
  • الـ Class Fields تمثل قيم الام, والتي تتدخل في عملية ولادتك دائماً بشكل فريد عن باقي اخوتك واخواتك. كأسمك, لون بشرتك, وتسمى نسبتاً لك بالعادة Object Attributes. وفي بعض الاحيان يكون بعضها قيم خاصة للإم نفسها كأسم امك (ملاحظة بالنسبة لإسم الام: راح يكون static و public اي ثابت وعام وتستطيع السؤال عنه بدون اوجكتات. اما باقي الاشياء فمن المفضل جعلها private اي خاصة).
  • الـ Instantiation هنا يبدئ التمهيد لعملية الولادة لك.
  • الـ Initialization هنا قامت بولادتك الام. طبعاً باستخدام كلمة new والنداء على الـ Constructor اي الرحم.
  • الـ Initialization Block عباره عن قطعه من الكود تعمل في كل مره تم انشاء اوبجكت من الكلاس, وتعمل مره واحده للكلاس نفسها. مثلاً كانها صرخة الولادة لكل طفل, او تحول المرأه الى ام, فالتحول هذا يصبح مره واحده في حياة المرأه.
  • ألـ Class Methods or Functions تعتبر الافعال التي سوف تعلمك اياها امك وتختمها عن ظهر قلب بعد ولادتك. ككيفية ترتيب سريرك, كيفية الاكل, فرك اسنانك بالفرشاه والمعجون, نطق اسمك الخ.... وايضاً بعض من هذه الافعال راح تكون static اي امك التي تقوم بها, ونستطيع استخدامها من خلال امك بدون اوبجكتات (بدون حاجتك), كفعل نطق امك لاسمها متى شائت.
  •  الـ Getter and Setter نتدرج من الافعال (الميثودز) التي تعلمك اياه امك.
  • الـ Inheritance اي كلمة extends تاتي بمعنى الوراثة, مثال: لو وضعنا هذه الكلمة بعد اسم امك ثم اتينا باسم جدتك, سوف ترث امك جميع تعاليم جدتك وافعالها وقيمها وطريقة تربيتها لإولادها وتطبقها عليك (الاوبجكت).
  • الـ Super تاتي هذه الكلمة في حالة الوراثة, اذا احتجت مساعده من الجده, تطلبها من خلال كتابة هذه الكلمة.
  • في حالة الوراثة تسمى امك بكلاس الـ Child Class وجدتك باسم الـ Parent Class او Super Class. وانت تصبح ملكيتك الى امك, والى كلاس جدتك ايضاً.
  • وايضاً (في حالة الورثاة) اذا اردت ان تتعامل مع امك حالياً تستخدم كلمة this واذا اردت ان تتعامل مع جدتك تستخدم كلمة super.
  • الـ Overriding او كلمة @Override الموجوده فوق بعض افعال (ميثودات) الام التي ورثتها. هذه الكلمة تضعها الام في حالة تريد تغيير في فعل ورثته من جدتك. اي اذا ورثة وصفة طبخ ما وتريد تغيير بعض من مقاديرها, هنا تستخدم هذه الكلمة.
  • لغة الجافا لاتحب الوراثة في كلاساتها! عكس لغة السي شارب! فالجافا لاتسمح للوراثة الا من شخص واحد او بالاحرى من جهه وحده. فإما ترث انت من جهت امك او من جهت ابوك! فقط لاغير. لتفتادي مشاكل التعقيد كمشكلة الالماسة القاتلة في البرمجة قدر المستطاع!
  • الـ implements تستخدم هذه الكلمة لتحقيق رغبة الوراثه المتعدده واشياء اخرى كثيره. فهي تأتي بعد اسم الكلاس تلحقها باسماء كثيره من الـ interface. وهكذا تصبح للكلاس خصائص متعدده كثيره بدون الوراثه, نستطيع القول هنا انها مشابهه بالتقليد! اي ان امك قامت باخد وتقليد طرق وقيم وافعال كل من عماتك, خالاتك, جاراتك الخ... في تربيتك, بدون الحاجه منها ان ترثهم.
  • الـ interface ليس معناتها واجهت المستخدم, بل المقصود هنا بالبرمجة هي الواجهه التي تكون بينك وبين اي طرف اخر تريده بالبرمجة. نستخدمها في البرمجة لإجبار الكلاس (امك) على اضافة افعال وقيم لها, بدون الحاجة الى الوراثة. وعلى امك ان تكتب هذه القيم والافعال كما تريد.
  • دائماً فضل استخدام الـ interface على الكلاس. اي دائماً فضل الـ implements على الـ extends.
  • ملاحظة: في حالة الوراثة لاتحتاج الى كتابة جميع افعال (ميثودز) تلك الكلاس. ولكن في حالة الـ implemention من interface تحتاج بشكل ضروري الى كتابة جميع تلك الافعال (ميثودز) كـ @Override والا ستتعطل الكلاس.
  • ملاحظة: للـ interface استخدامات متعدده وكثيره جداً.
  • الـ abstract كلمة تستخدم قبل اسم الكلاس, لجعها كلاس مجرده! اي جدة قابلة للوراثة فقط ولا تستطيع ولادة اي كائن لا امك ولا انت! اي كانها جدة قامت بتبني امك ثم قامت امك بوراثتها! يقوم عملها كـتعامل امك مع الـ interface تقريباً.

 

شرح بعض من كلمات لغة الجافا التي تتداخل مع مفهوم الكلاس بشكل تقريبي للحياة الطبيعية

  • كلمة الـ private اي خاص, تستخدمها للاشياء الخاصة فقط, كمثلا لون ملابسك الداخلية.
  • كلمة الـ public اي عام, تستخدمها للاشياء التي تريدها ان تكون عامه ومنظوره من قبل الجميع كوجهك.
  • كلمة الـ protected اي خاصة بعض الشئ, تستخدمها للاشياء التي تريدها فقط ان تكون معروفة بين افراد اسرتك واقربائهم, ومخفيه على العالم. كاسرار عائلتك مثلا.
  • بدون كلمة! خاصة فقط لك و لعائلتك التي في منزلك فقط لا اقرباء. وهذا هي القيمة الافتراضية بلغة الجافا, اي انك اذا لم تختر اي من احد الكلمات الثلاث السابقة.
  • كلمة الـ final تستخدم للاشياء التي نريدها ان تكون غير قابله للتغير. كنسبك الى امك, لاتستطيع تغييره ابداً.

 

مثال برمجي للكلاس:

هذا مثال برمجي يحاكي ماتم تناولة في النقاط السابقة.

كلاس الام:

حاول ان تتمعن بالكلاس وارجع الى النقاط بالشرح لتوضيح الفهم لديك وتقريب المعنى.

/**
 * Created by mohammad on 10/13/17.
 */

public class Mother extends GrandMother implements Aunt, Uncle{

    // Class Fields
    public static final String TAG = "Mother Class Tag"; // <--- filed can not be changed
    private String mName;
    private String mSkinColor;
    public static String mYourMotherName;
    private static int mTotalChild = 0;

    // Initialization Block - running just one time
    // Static one
    static {
        Log.d("TAG", "static initializer: Woman Become Mother");
    }

    // Initialization Block - running each time an object created
    // instance one
    {
        Log.d(TAG, "instance initializer: Mother Cry of pain");
        mTotalChild = mTotalChild + 1;
    }

    // Class Constructor
    public Mother(String childName){
        mName = childName;
    }

    // getters and setters (same as methods/functions)
    public static int getChildNumber(){
        return mTotalChild;
    }

    public static void setYourMotherName(String yourMotherName){
        mYourMotherName = yourMotherName;
    }

    // methods / functions
    public void eat(){
        Log.d(TAG, this.mName + " eat: I'm eating ..."); // <-- this, refer to who is eating here
        Log.d(TAG, mName + " eat: I'm eating ..."); // <-- or by using m principle better
    }

    public void speak(){
        Log.d(TAG, "speak: My name is: " + mName);
    }

    // method from GrandMother class
    // Okay to remove it if you don't need it
    @Override
    public void cookingPizza() {
        super.cookingPizza();   // <-- making the pizza with grandMother recipe.
                                // <-- if you want yours recipe remove super.cookingPizza();
                                // <-- and write your recipe.
    }

    // method from you Aunt interface
    // you must implemented it (have it) or your program gonna crash (you can't remove it)
    // and it's okay to leave its body empty.
    @Override
    public void drawing() {

    }
    
}

 

استخدامها:

        // Instantiation        Initialization
        Mother firstChild = new Mother("Noah");
        Mother secondChild = new Mother("Emily");

        // setting a name for your mother by using the setter
        Mother.setYourMotherName("Emma");
        //  calling your mother name from her static fields
        Log.d(TAG, "Your MotherName is : " + Mother.mYourMotherName);

        // making you and your sister doing what your *mother* teach you
        firstChild.cookingPizza(); // <-- *her* inherited cooking pizza from her grand mother and teach it to you.
        secondChild.eat(); // <-- *her* teach your sister how to eat.

        // asking your mother how many child she give birth to
        Log.d(TAG, "Total Children: " + Mother.getChildNumber());

 

النتيجة:

Woman Become Mother
initializer: Mother Cry of pain
initializer: Mother Cry of pain
Your MotherName is : Emma

Class: cookingPizza: Pizza is cooking
Class Tag: Emily eat: I'm eating ...
Class Tag: Emily eat: I'm eating ...

Total Children: 2

 

اخيراً

اتمنى ان المعلومة وصلت بسهوله لك اختي \ اخي القارئ. فهذه كانت فقط لايضاح وتقريب معنى مفهوم الكلاس. وليس شرح كامل للكلاس او طرق انشائها. واكرر اتمنى ان المعنى قد اتضح لديك عزيزي القارئ.

 

mzdhr

0


اراء المستخدمين


لاتوجد تعليقات لعرضها .



انشئ حساب جديد او قم بتسجيل دخولك لتتمكن من اضافه تعليق جديد

يجب ان تكون عضوا لدينا لتتمكن من التعليق

انشئ حساب جديد

سجل حسابك الجديد لدينا في الموقع بمنتهي السهولة .


سجل حساب جديد

تسجيل الدخول

هل تمتلك حساب بالفعل ؟ سجل دخولك من هنا.


سجل دخولك الان

Ads Belongs To mzdhr

  • ماهي قاعدة بيانات الـMongoDB؟
    في السابق كان الحديث حول قواعدة البيانات المعروفه و المتوارد بين اقطاب المبرمجين من مختلف الأصعدة ابتدا من web developers إلى الـsoftware developers على مختلف المنصات windows, OSX, Linux و جل الحديث كان يدور حول نوع واحد فقط وهو RDBMS Relational database management system مثل  MS SQL Server, IBM DB2, Oracle, MySQL, and Microsoft Access  التي تعتمد في حفظ البيانات داخل جداول ولكن في الآونة الأخيرة و بعد صدور عدد من JS Frameworks  و ارتفاع عدد مستخدمي لغة الجافاسكربت بدأت شركة 10GEN في العمل على قاعدة بيانات من نوع مختلف تماما عما سبق ذكرة وهي NoSQL تحت اسم MongoDB اي قاعدة بيانات لا توجد بها علاقة بين الجداول وتعتمد في حفظ البيانات كمستندات BOSN ويعد هذا النوع الأشهر بين عائلة الـNoSQL وهنا ننوه بأن جميع ما تعرفه عن الـSQL Databases قد يتغير فبالتاكيد لن يكون هناك كوريز بالطريقة التي اعتدت العمل عليها.
     
    1- أمثله
    وبما ان الكثير من المبرمجين لديه خلفية في الـMySQL سأقوم بمقارنة سريعة حول الأختلافات السطحية بين المونجو والـMySQL:
    اسم الـTable في الـMongoDB هو Collection اسم الـRow في الـMongoDB هو Document تعتمد قواعد بيانات الـRDBMS على الجداول كالنحو التالي:
     

     
    بينما قاعدة بيانات الـMongoDB تعتمد على BSON وهذا يعني Binary Encoding Of JSON Objects وتكون كالنحو التالي:
    { "_id" : ObjectId("57fe832b13e6a51130a23d2a"), "ID" : 1, "username" : "abdulla", "email" : "[email protected]" } { "_id" : ObjectId("57fe832b13e6a51130a23d2b"), "ID" : 2, "username" : "omar", "email" : "[email protected]" } { "_id" : ObjectId("57fe832b13e6a51130a23d2c"), "ID" : 3, "username" : "mohammed", "email" : "[email protected]" }  
    امثلة حول الفروقات في عمليات الـQueries مابين الـMongoDB و الـMySQL OR RDBMS ولنفترض بأن لدينا جدول و كولكشن يحتويان على عدد من الصفوف والدوكيومنتس فيهم معلومات حول مستخدمين
    عرض جميع المستخدمين من هم دون السن الـ24 SELECT * FROM users WHERE age < 24 db.users.find({"age": { $lt: 24 }}) // $lt = less than  
    عرض جميع المستخدمين الذين  اعمارهم مابين الـ20 والـ30 SELECT * FROM `users` WHERE `age` BETWEEN 20 AND 30 db.users.find({ age: { $gt: 20, $lt: 30 }}) // $gt = greater than  
    عرض المستخدمين الذين اسمائهم تحتوي على حرف A في الاول او الاخير او المنتصف لايهم SELECT * FROM `users` WHERE username LIKE %A% db.users.find({username: /A/})  
    و في حالة الإضافة INSERT INTO `users` (username,age,status) VALUES ('abdulla',25,'active') db.users.insertOne({username: "abdulla", age: 25, status: "active"})  
    ولكن هناك فارق كبير في هذه الكويري و بما ان قاعدة بيانات الـMongoDB ليست Relational بالتالي ليس هناك Schema محدده عند الإضافه فتستطيع مثلا إضافة document بمتغير col,field ليس موجود في الـdocument السابق او التالي في نفس الـCollection وبهذا يقال للـMongoDB بأن اهم مميزات هذا النوع من قواعد البيانات بأنه Flexible او Dynamic Schema  ومثال على ذلك:
    db.users.insert([ { username: { fname: "abdulla", lname: "bahraini" }, age: 25, status: "active" }, { username: "mohammed", age: 19, status: "not active" } ])  
    2- لماذا التحول الى MongoDB ( وجهة نظر )

     
    كما اسلفنا سابقا ومع صدور عدد من js frameworks وبالاخص Meanjs المعني ب expressjs , angularjs & nodejs بالاضافه الmongodb و توسع هذه الفريموركس بشكل ضخم و رهيب جدا ومنها النود التي اصبحت خطر داهم على لغة الphp مقارنة بالسرعة, الاداء الرهيب وتناغم المونجو مع هذه الفريموركس بشكل افضل سبب في توجه الكثير من المطورين الى المونجو.
     
    ليس عند هذا الحد وحسب بل نظرا الى سرعة المونجو حسب الاحصائيات تبين اهمه الانتقال من قواعد البيانات الاعتيادية الى المونجو.
    تجربة اضافه 10000 صف و دوكيومنت في MySQL و MongoDB .. نلاحظ الفرق في سرعة الاداء احتاج المونجو الى ثانتين لتنفيذ المهمه بينما الMySQL احتاج الى 3 دقائق تقريبا.
     


     
    3-التثبيت
    لتثبيت الـMongoDB قم بالدخول على الرابط واختر ما يناسب نظام جهازك
     
    بعد التثبيت إن كنت  من متسخدمي الوندوز انشأ مجلد في داخل الـC (في حال تم تثبيت المونجو في السي)
     
    أضف المتغير التالي في PATH Environment وتجده في المسار التالي
    this pc >> proprieties >> Advanced System Settings >>  Advanced tab >> Environment Variables >> in System Variables find PATH then Click Edit
     
    افتح الـCMD واكتب الكوماند التالي لتفعيل خدمه الـMongoDB في جهازك وستعمل على بورت 27017 بشكل افتراضي
     
    ثم افتح CMD أخر واكتب الكوماند التالي للدخول على MongoDB SHELL
     

     
    بالتالي ستكون داخل الـMongoDB SHELL وتستطيع التعامل معه من خلال الاوامر المباشرة وللإطلاع اكثر اكتب help
     
    مستوى المقال: مبتدئ

    بواسطه AbdullaScript , في

  • المستوى: مُبتدأ/متوسّط
     
    يُمكن الاستفادة من مكتبة Multer في nodejs لرفع الصور والملفّات إلى السيرفر، فبأسطر برمجية بسيطة يُمكن رفع الملفات التي قام المُستخدم بتحديدها
    let app = require("express")() let multer = require("multer") let upload = multer({ dest: 'uploads/' }).any() app.get("/", (req,res)=>{ res.send("Teting...") }) app.post("/upload", (req, res)=>{ upload(req,res, (err)=>{ if (err) throw err }) res.send(req.files) }) app.listen(3000, ()=>{ console.log("Let's Upload....") }) الكود السابق يقوم باستلام الملفّات التي يُرسلها المستخدم إلى المسار /upload ليقوم برفعها ثم طباعة اسم الملف المُستلم. لكن وبعد تنفيذه قد تتفاجئ بأن عملية الرفع تجري بنجاح، إلا أن الاسم لا يظهر ويتم إرسال مصفوفة فارغة على الرغم من أن عملية الرفع تمّت دون مشاكل.
    السبب في ذلك هو طبيعة Nodejs، والتي سبق وأن تحدّثت عنها في مقال سابق بعنوان "تنفيذ الطلبات بتسلسل وترتيب في Nodejs باستخدام Async/Await". انصحك بقرائته لفهم آلية عمل إطار العمل بشكل كامل.
    ما يحدث على أرض الواقع هو أن النظام يبدأ بالرفع، ولأن تنفيذ المهام في nodejs يتم بشكل متوازي لتجنّب تأخير الرد على طلب المستخدم، سيقوم النظام فورًا بطباعة محتويات مصفوفة الملفّات req.files، التي ستكون فارغة بالفعل لأن النظام لم ينتهي بالأصل من عملية الرفع. والحل في هذه الحالة هو استخدام async/await ليُصبح الكود من الشكل:
    let app = require("express")() let multer = require("multer") let upload = multer({ dest: 'uploads/' }).any() app.get("/", (req,res)=>{ res.send("Testing Routes.....") }) let uploadPromise = (req, res)=>{ return new Promise((Resolve, Reject)=>{ upload(req,res, (err)=>{ if (err) Reject(err) Resolve() }) }) } app.post("/upload", async(req, res)=>{ try{ await uploadPromise(req, res) res.send(req.files) }catch(uploadErr){ throw uploadErr } upload(req,res, (err)=>{ if (err) throw err }) }) app.listen(3000, ()=>{ console.log("Let's Upload....") }) حاول تنفيذ الكود السابق وسترى أن اسم الملف سيظهر دون مشاكل لأن النظام قام أولًا برفع الملف ثم قام بطباعة الاسم، وهذا يعني أن المصفوفة لم تعد فارغة بشكل كامل. الفيديو التالي يشرح الفرق بشكل عملي:
    أما الراغبين بتحديد لاحقة الملف أو قبول نوع مُحدّد من الملفات فهم بحاجة لتعديل بعض جزئيات الكود، ولتجنّب تعقيد الأفكار ما بين Async/Await، سأقوم باستخدا مثال بسيط عن Multer.
    let app = require("express")() let multer = require("multer") let upload = multer({dest: "uploads"}) app.post("/", upload.single("photos"), (req,res)=>{ res.send("OK...") }) app.listen(3000, ()=>{ console.log("Ready to upload...") }) الكود السابق يشرح طريقة رفع ملف إلى مُجلّد uploads باستخدام multer، فعند طلب الرابط domain.com/ باستخدام POST فإن النظام سيأخذ الملف الموجود في الحقل photos وسيقوم برفعه. لكن ماذا لو أردنا تغيير الاسم أو اختيار اللاحقة؟ الأمر يتم من خلال ميثود موجودة داخل multer تُعرف بـ diskStorage ليُصبح الكود من الشكل
    let app = require("express")() let multer = require("multer") let storage = multer.diskStorage({ destination: function(req, file, cb){ cb(null, "uploads") }, filename: function(req, file, cb){ let ext = file.mimetype.split("/") ext = ext[ext.length-1] cb(null, file.originalname + "-"+Date.now()+"."+ext) } }) let upload = multer({storage:storage}) app.get("/", (req, res)=>{ console.log(Date.now()) }) app.post("/", upload.single("photos"), (req,res)=>{ res.send("OK...") }) app.listen(3000, ()=>{ console.log("Ready to upload...") }) قُمنا في الميثود بتعريف خاصيّتين الأولى هي destination الخاصّة بتحديد مكان الرفع، والثانية هي اسم الملف. الشرط الوحيد في الخصائص داخل multer هو استخدام دالة cb، وهي اختصار لـ Call Back لتمرير النتيجة التي نرغب بها.
    في مثالي في الأعلى قُمت بفحص نوع الملف باستخدام الـ mimeType الخاص به، فلو كان صورة سيظهر بالشكل image/jpeg أو image/png وهكذا. بعدها قمت بإضافة تلك اللاحقة للاسم الذي يُمكنك تسميته كيفما تشاء. أما بخصوص رفع نوع واحد من الملفات دونًا عن الغير فهذا مُمكن عبر تعديل السطر الخاص بتعريف upload ليُصبح من الشكل 
    let upload = multer({storage:storage, fileFilter: function(req, file, cb){ if (file.mimetype != "image/jpeg"){ return cb(null, false) } cb(null, true) }}) قُمنا بإضافة ما يُعرف بالـ fileFilter، وهي خاصيّة موجودة في multer قُمنا فيها بفحص نوع الملف مرّة أُخرى عبر mimeType وفي حالة عدم مُطابقة الشروط نقوم برفض الملف من خلال استخدام إعادة الـ callback فارغ مع false. بهذه الحالة سيقفز النظام عن الملف وسيتجاوزه.
    الفيديو التالي يشرح كل شيء
     
    في حالة وجود أي استفسار يُمكن تركه في التعليقات أو مُراسلتي عبر حسابي في تويتر @FerasAllaou
    مستوى المقال: مبتدئ

    بواسطه feras , في

  • السلام عليكم ورحمة الله وبركاته 
    طرحنا مسابقة عالم البرمجة للنقاش الهادف ، و هدفنا إثراء المحتوى العربي في مجال البرمجة ، فاز معنا الطرح المتميز و المفيد حيث قام بتقييم المقالات وترقيتها فريق عالم البرمجة سنذكر بهذه المقالة الفائزين معنا ، و مقالاتهم ، و نشكرهم على ماقدموا من فائدة للجميع ، و إثراء المحتوى العربي في البرمجة.
     
    الفائزون في شهر January 2018
    المقال الفائز:
    المقال الفائز:
    المقال الفائز:
    المقال الفائز:
    المقال الفائز:
    المقال الفائز:
    المقال الفائز:
    المقال الفائز:
    المقال الفائز:
    المقال الفائز:
     
     
    في الختام:
    هدفنا في موقع عالم البرمجة إثراء المحتوى العربي في مجال البرمجة ، و تعزيز حب المساعدة بين المبرمجين تستطيع كتابة ماتحب في ساحات النقاش ، و يمكن تكون احد الفائزين معنا  بمسابقة عالم البرمجة للنقاش الهادف فهي مازالت مستمره ايضا تستطيع مساعدة المبرمجين بالإجابة عن أسئلتهم ، و حل المشاكل التي تواجههم بقسم سؤال وجواب ؛ لتكون مرجع لبقية المبرمجين شعارنا في عالم البرمجة "إن في قضاء حوائج الناس لذة لا يَعرفها إلا من جربها، فافعل الخير مهما استصغرته فإنك لا تدري أي حسنة تدخلك الجنة." -ابن القيم-  وممكن تستفيد من
    حبيبي القارئ اعلم ان فريق عالم البرمجة يصب كل جهودة لمساعدة المبرمجين الذين يخصصون من وقتهم لنشر العلم المفيد ويساعدون الغير ويارب يقدرنا نوقف معكم ونساعدكم قد مانقدر.
    مستوى المقال: مبتدئ

    بواسطه Ali Majrashi , في

  • بسم الله الرحمن الرحيم
    السلام عليكم ورحمة الله، كيف حال الجميع؟ عساكم بألف خير و عافية.
    سأحاول باذن الله البدأ في سلسلة جديدة حول تعلم أساسيات رياكت (React) و (RN = React Native) كما تعلمون هي مكتبة عرض (View) أطلقتها شركة الفيسبوك لبناء واجهاتك البرمجية (User Interfaces)  بطريقة سلسة و سهلة مبنية على نظام (Virtual DOM). و أول نسخة رسمية منها بتاريخ مارس 2013. و لما نقول أنها مكتبة عرض ليست اطار عمل (MVC) ركّز هنا جيّداً أخي القارئ؛ حيث تمثل هي حرف (V) فقط لا تقدم خدمة المتحكم (Controller) و لا (Model).
    بداية تعلمك React يصادفك شئ جديد عند كتابة أول مكوّن (Component's) حيث أنها تعود (returning) بصيغة تشبه صيغة HTML! ربما لم تلاحظها في مكتبات أو أطر عمل أخرى. تسمى بالـ JSX
    فما هي يا ترى JSX ؟ 
    JSX عبارة عن صيغة (syntax) أقول أُخترعت لمكتبة React التي تبدو مشابهة جداً لـ xHTML التي تمكنك من انشاء عناصر واجهتك البرمجية (Create Elements) بسهولة و يسر عن طريقها بدلاً من استعمال وضائف (functions) تستدعيها يدوياً لتنفذ مهمة معيّنة. ربما هذه نقطة مبهمة للبعض لكن ستفهمها بعد قليل باذن الله.
    من المهم أن تعلم أن جميع مكونات React المبنية بصيغة JSX تترجم من شفرة لشفرة (transpiler) الى تعليمات جافاسكربت حقيقية (Real JavaScript) باستخدام مكتبة تدعى بابل (Babel) تقوم بتحويل الرياكت الى شفرة ES5 القديمة لتشتغل على جميع المتصفحات (حتى القديمة منها).
    لنكتب مثالا بسيطاً بالـ JSX : 
    return <span> أهلا بعالم البرمجة! </span>; هل لاحظت سهولة كتابة جملة، و ارجاعها للظهور في المصتفح بكل سهولة مرفقة بكلمة (Return). تخيّل لو كتبناها بصيغة ES5 القديمة؟! 
    return React.createElement( 'span', {}, 'أهلا بعالم البرمجة!'); كم سطراً كتبناه لنعيد الجملة للظهور باستخدام جافاسكربت طبيعية! في هذا المثال استعملنا وظيفة (function) تسمى بـ React.createElement صيغتها كالتالي: 
    React.createElement( string|element, [propsObject], [children...]) ماذا لو أردنا كتابة عدة جمل متفرقة بداخل الشفرة البرمجية! ستكون هكذا بلا شك!
    React.createElement('div', {}, React.createElement('div', {}, 'text1'), React.createElement('div', {}, 'text2', ) ); لكن لسهولة JSX و هذا ما تميّزت به شركة الفيسبوك صراحة في مكتباتها البرمجية، الشفرة السابقة مثلاً باستخدام JSX : 
    function text1() { return <span>text1</span>; } function text2() { return <span>text2</span>; } هنا نستنتج مرة أخرى، أن JSX رائعة جدا و اختزال (shorthand) لكثرة الشفرات البرمجية التي تؤدي نفس الوظيفة. مما يكلفك وقتا اضافيا و كثرة المشاكل (bug's) عند تنقيح برمجياتك و تطبيقاتك؛ هذا كود شامل و أوسع، تلاحظ أنه يمكنك من تقسيم واجهاتك البرمجية عبر مكونات مختلفة و التحكم بها كلٌ على حِدة.
    من الثلاث خصائص المتوفرة في JSX هي : 
    العناصر المتداخلة (Nested elements): حيث يمكنك الجمع بين عدة عناصر (Multiple elements)  في حاوية واحدة (container element) كـ <div> مثل المثال الذي بالأسفل.
    السمات (Attributes): داخل كل عصنر div لك أن تضيف وظائف متعددة كـ (className، selected، style) ..الخ. 
    تعبيرات الجافاسكربت (JavaScript expressions): يمكنك اضافة تعابير (ليست شرطية statements)  داخل JSX كعمليات الحساب و المهم أن تكون ضمن قوسين {} .
    import React from 'react'; class App extends React.Component { render() { return ( <div> <p>Header</p> <p>Content</p> <p>Footer</p> </div> <div> <h1>{10+1}</h1> </div> <div style={{ height: 10 }}> Hello World! </div> ); } } export default App; في التعبيرات ذكرنا أنه لا يمكن استخدام التعابير الشرطية كـ if و else باستثناء التعبير الشرطي الثلاثي: { i === 1 ? 'true' : 'false' }  مثال : 
    import React from 'react'; class App extends React.Component { render() { const i = 1; return ( <div> <h1>{ i === 1 ? 'true' : 'false' }</h1> </div> ); } } export default App; من النصائح التي أقدمها و لا يجب عليك نسيانها: جميع أسماء المكونات (components) تكتب بحروف صغيرة (lowercase) التي تكون مدمجة بـعناصر HTML أو SVG كـ (div, ul, rect, etc.) و لا تنسى اغلاق العناصر بأوسمتها (Close Every Element) مثال مبسط: 
    // DO THIS: return <br/>; return <input type='password' .../>; return <li>text</li>; // NOT THIS: return <br>; return <input type='password' ...>; return <li>text; هذه أهم أساسيات JSX التي يجب على كل شخص معرفتها لمحبي تعلم ReactJS و RN عموماً. أتمنى تكون مفهومة للجميع. 
    و السلام عليكم.
    مستوى المقال: مبتدئ

    بواسطه عبدالهادي , في

  • بسم الله الرحمن الرحيم
    السلام عليكم ورحمة الله وبركاته
    تعرفنا في بداية سلسلة مواضيعنا على طريقة من طرق تخزين البيانات وهي القوائم سواء الأحادية أو الثنائية، كما ونعلم بأن هناك
    طريقة أخرى احفظ مجموعة البيانات وهي أبسط طريقة والتي تتمثل في المصفوفات سواء المصفوفات العادية أو مصفوفات القوائم.
    في هذا الدرس سنتعرف على أحد أفضل الطرق في حفظ البيانات والتي تعتبر من الأفضل من ناحية العرض أو البحث وغيرها
    من الأمور المتعلقة بهذه المجموعة من البيانات. كما هو الحال في القوائم فإن الأشجار لديها أكثر من نوع وكل واحد منهم له خواصة واستخداماته.
    في هذا الدرس سنتعرف على أحد أنواع الأشجار وهو الأشجار الثنائية.
     
    ماذا نقصد بالأشجار الثنائية (Binary Trees):
    هو نوع من أنواع تمثيل البيانات ويتكون من مكونين أساسيين هما العقد (Nodes) و الأقصان (Arcs). 
    عندما نقوم بتمثيل هذه الشجرة فإننا نقلب مفهومها فيكون الجذر (Root) في الأعلى والأقصان في الأسفل.
    سميت بالأشجار الثنائية لأنه كل عقد لديه عقيدين يرتبط فيهم وهما أبنائه ولديه والد واحد.
    هناك بعض المصطلحات التي يجب أن نتعرف عليها قبل الشروع الى صلب الموضوع:
    - العقد (Node): وهو كل عنصر موجود في الشجرة، وهو المكان الذي يتم حفظ البيانات داخله.
    أنواع خاصة من العقد (Nodes):
                   - الجذر (Root): وهو العنصر الذي ليس لديه والد أي أنه أعلى عنصر في الشجرة. وكل شجرة تحتوي على جذر واحد فقط.
                   - الأوراق (Leaves): وهذه هي مجموعة العقد التي ليس لديها أي أولاد. أي أنها في طرف الشجرة.
    - القصن (Arc): هو الرابط الذي يربط العقد بين بعضها وهو ذي اتجاه واحد من الأعلى الى الأسفل.

     
    يختلف مفهوم الشجرة الثنائية Binary Tree  حيث أن بعضها لا تحقق بعض الشروط مما يؤدي بها الى أن تكون عبارة عن قائمة عادية
    لكن الأنواع الأخرى تحتوي على شروط التي تجعلها شجرة فعالة بأكبر قدر ممكن و تسمى بـ Binary Search Tree وهذا اساس جميع ما يلي.
     
    تمثيل الشجرة الثنائية (Binayr Tree):
    ١. عن طريق المصفوفات (ArrayLists): وهذه الطريقة لديها مشاكلها كما ذكراناها سابقاً.
    ٢. عن طريق القوائم الثنائية (Linked lists): وهذه هي الطريق الأمثل لتمثيل الشجر.
     
    أكواد الشجرة الثنائية (Binary Tree):
    أ- إنشاء كلاس خاص بالعقد (Nodes) :
    هذا الكلاس يسمى بـ BSTNode وهو كالتالي:
    public class BSTNode { protected int key; protected BSTNode right, left; public BSTNode(){ this(0); } public BSTNode(int k){ this(k, null, null); } public BSTNode(int k, BSTNode r, BSTNode l){ this.key = k; this.right = r; this.left = l; } public void addRight(BSTNode r){ this.right = r; } public void addLeft(BSTNode l){ this.left = l; } } هذا الكلاس يحتوي على المتغيرات التالية:
    - Key: وهو من نوع و int وهو المكان الذي يتم حفظ البيانات داخله.
     - right & left: وهما القصنان (Arcs) والذان يربطان العقد بأبنيه اليمين والشمال.
    كما نرى فإننا نستطيع إنشاء عنصر من هذا الكلاس سواء كان في بيانات أو لا. لديه أولاد أولا.
    كما وأنه لدينا ميثودين نستخدمها لإضافة ابن لليمين أو لليسار.
     
    ب- انشاء كلاس الشجرة الثنائية (Binary Search Tree):
    public class BST { private BSTNode root = null; public BST(){ } public void clear(){ this.root =null; } public boolean isEmpty(){ return root == null; } public void visit(BSTNode n){ System.out.println(n.key + " "); } } هنا نقوم بانشاء الهيكلة الأساسية للشجرة ويحتوي على التالي:
    - root: الجذر وهو رأس الشجرة والوحيد الذي يربطنا بكامل عناصر الشكرة. وفي بداية انشاء الشجرة يكون الجذر فاضي.
    لدينا الكثير من الميثود لكن سنذكر هنا الأشياء الأساسية ونترك الباقي للدرس القادم بحيث أنها تحتوي على الكثير من التفاصيل:
    * clear(): تستخدم لتفريغ الشجرة من البيانات؛ وبما أن الجذر هو الرابط الوحيد لعناصر الشجرة فإن حذف الجذر سيؤدي الى حذف الشجرة كلها.
    *isEmpty(): وستخدم للاستعمال اذا ما كانت الشجرة خالية أو لا. ترسل true في حال كانت الشجرة خالية.
    *visit(): تستخدم لطباعة قيمة القيمة داخل العقد المرسل.
     
    خلال الشرح القادم إن شاء الله سنتطرق لاضافة وحذف عناصر من الشجرة، كذلك كيف نقوم بطباعة جميع عناصر الشجرة.
     
    اسأل الله العلي العظيم بأني وفقت لاصال المعلومة بابسط طريقة
     
    في حفظ الله
    مستوى المقال: متوسط

    بواسطه Abather , في

  • Ads Belongs To mzdhr

    عالم البرمجة

    عالم البرمجة مقالات برمجة و دورات مجانية لإحتراف البرمجة هدفنا تبسيط البرمجة ونشرها بيد الكل بشكل ممتع ومتطور ومحدث بإستمرار لمواكبة جديد تطورات البرمجة الحديثة و المتقدمة بدون مقابل