CodeGym /مدونة جافا /Random-AR /8 أخطاء شائعة يرتكبها المبرمجون المبتدئون
John Squirrels
مستوى
San Francisco

8 أخطاء شائعة يرتكبها المبرمجون المبتدئون

نشرت في المجموعة
أهلاً! سنلقي اليوم نظرة على 8 أخطاء شائعة جدًا يرتكبها مطورو Java المبتدئون (وغيرهم). ستجد الكثير من هذه القوائم على الويب: الكثير منها متشابه مع بعضها البعض. عندما قمنا بتجميع قائمتنا، استرشدنا بمعيار واحد: ما إذا كنا قد ارتكبنا الأخطاء بأنفسنا أثناء دراستنا أو توظيفنا :) لم يتم فرزها حسب الأهمية - فهي على نفس القدر من الأهمية بالنسبة لك لفهمها وتذكرها.
  1. مقارنة الكائنات باستخدام == .

    يقوم عامل التشغيل == بمقارنة مراجع الكائنات.

    تشير المراجع إلى العناوين الموجودة في الذاكرة. إذا تم تخزينها في عناوين مختلفة، فإن المقارنة باستخدام == ستعيد false .

    public class Vehicle {
    
        String model;
        int maxSpeed;
        int yearOfManufacture;
    
        public Car(String model, int maxSpeed, int yearOfManufacture) {
            this.model = model;
            this.maxSpeed = maxSpeed;
            this.yearOfManufacture = yearOfManufacture;
        }
    
        public static void main(String[] args) {
            Car ferrari = new Car("Ferrari 360 Spider", 280, 1996);
            Car ferrariTwin = new Car("Ferrari 360 Spider", 280, 1996);
            System.out.println(ferrari == ferrariTwin);
        }
    }

    لمقارنة الكائنات، لدى فئة الكائن طريقة خاصة: يساوي () . بصراحة، تطبيقه الافتراضي ليس سيئًا:

    public boolean equals(Object obj) {
        return (this == obj);
    }

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

    الشيء الوحيد الذي يجب ألا تنساه هو قائمة المتطلبات لتجاوز يساوي() بشكل صحيح . يمكنك العثور عليها بسهولة على شبكة الإنترنت.

  2. استخدام المتغيرات غير الثابتة في الطرق الثابتة (والعكس صحيح).

    إذا سبق لك أن رأيت الرسالة "لا يمكن الرجوع إلى المتغير غير الثابت x من سياق ثابت"، مرحبًا بك في النادي :)

    لا تتمتع الطرق الثابتة بإمكانية الوصول إلى المتغيرات غير الثابتة (المثيل).

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

    بالمناسبة، السير في الاتجاه الآخر يعمل بشكل جيد: يمكنك استخدام المتغيرات الثابتة بطرق غير ثابتة:

    public class Main {
    
        public int x = 10;
    
        public static int staticX = 100;
    
        public static void main(String[] args) {
    
            System.out.println(x); // Compilation error - you can't do this!
        }
    
        public void printX() {
    
            System.out.println(staticX); // But you can do this!
        }
    }

  3. سوء فهم كيفية تمرير الوسائط إلى الأساليب: حسب المرجع أو القيمة.

    يتم تمرير الكائنات والأوليات إلى الأساليب بطريقتين مختلفتين: أولاً، عن طريق المرجع؛ ثانيا من حيث القيمة.

    غالبًا ما يجد المبتدئون صعوبة في فهم هذا المفهوم. ونتيجة لذلك، يتصرف الكود الخاص بهم بشكل غير متوقع:

    public class Main {
    
        public static void main(String[] args) {
    
            int x = 7;
            incrementNumber(x);
            System.out.println(x);
    
            Cat cat = new Cat(7);
            catLevelUp(cat);
            System.out.println(cat.getAge());
    
        }
    
        public static void catLevelUp(Cat cat) {
    
            cat.setAge(cat.getAge()+1);
        }
    
        public static void incrementNumber(int x) {
            x++;
        }
    }

    إذا كنت لا تعرف بالضبط أي رقم سيزداد وأي رقم لن يزيد (الرقم القديم العادي أم عمر القطة)، فأعد قراءة درسنا حول هذا الموضوع .

  4. تجاهل قواعد الترميز.

    وهذا لا ينطبق فقط على الامتثال لبعض المبادئ "التقنية"، ولكن أيضًا على اصطلاحات التسمية العادية.

    كل هذه القواعد (كيفية تسمية المتغيرات، وكيفية كتابة أسماء الطرق) تم اختراعها لسبب ما. إنها تؤثر حقًا على سهولة قراءة التعليمات البرمجية

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

    public class Cat {
    
        private int S_O_M_E_T_H_I_N_G = 7;
        public String striiiiiiiiiiiiiing;
        protected double I_HAVE_NO_IDEA_WHAT_THIS_IS = 3.14;
        boolean random = Math.random() > 0.5;
    
    }

    قد تتمتع التعليمات البرمجية الخاصة بك بأداء عالٍ ببراعة، ولكن إذا كان من المستحيل قراءة وفهم كيفية عملها فعليًا، فللأسف، لا تستحق الكثير.

    إذا التزمت بمعايير البرمجة، فحتى لو كانت التعليمات البرمجية الخاصة بك بعيدة عن المثالية، فسيتمكن زملائك في العمل الأكثر خبرة على الأقل من إخبارك بكيفية تحسينها من وجهة نظر فنية :)

  5. سوء فهم فئة السلسلة

    public class Main {
    
        public static void main(String[] args) {
    
            String s1 = "I'm learning Java";
            String s2 = new String("I'm learning Java");
    
            System.out.println(s1 == s2);
        }
    }

    إذا كنت لا تعرف سبب عرض هذا الرمز خطأ ، فمن الواضح أنك بحاجة إلى تعزيز معرفتك :)

    غالبًا ما لا يكون المبتدئون على دراية بمجمع السلسلة وكيفية عمله.

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

  6. التعامل مع الاستثناءات بشكل غير صحيح.

    المبتدئين ليسوا الوحيدين الذين يتعثرون في هذا. يتعثر المطورون ذوو الخبرة أيضًا. الأسباب كثيرة.

    أولا، لا توجد وصفة عالمية. تحتوي البرامج على جميع أنواع الأخطاء المختلفة وسيناريوهات مختلفة لمعالجة الأخطاء.

    ثانيًا، لا يفهم الجميع كيفية تنظيم تتبع المكدس . هناك الكثير من الأخطاء في التعامل مع الأنماط المضادة، وكل منها "خاطئ" بطريقته الخاصة. هذا يعني أنه من الأسهل كثيرًا التعامل مع الأخطاء بشكل خاطئ أكثر من أي شيء آخر.

  7. عدم الفهم الكامل لكيفية عمل العوامل (الحسابية والمنطقية وغيرها).

    8 أخطاء شائعة يرتكبها المبرمجون المبتدئون - 2

    وهنا مثال بسيط. هل يمكنك معرفة ما سيعرضه هذا الرمز على الفور؟

    public class Main {
    
        public static void main(String[] args) {
    
            int i = 6;
            System.out.println(7 == i++);
        }
    }

    إذا أجبت بشكل غير صحيح أو خمنت للتو، فلا يزال لديك فجوات معرفية في هذا المجال :)

    سيعرض الكود خطأ ، لأن عامل المساواة ( == ) له أولوية أعلى من عامل الزيادة اللاحقة ( ++ ). لذلك، يتم تنفيذ المقارنة 7 == i أولاً، وعندها فقط يتم تنفيذ عملية i++ .

    بالمناسبة، كان لدينا أيضًا درسًا مفصلاً حول هذا الموضوع. إليك الرابط إذا فاتتك.

  8. حذف فاصل الكلمات في بيان التبديل .

    من المؤكد أن العديد من الأشخاص الذين قرأوا هذا المقال ارتكبوا هذا الخطأ! :)

    public class Main {
    
        public static void main(String[] args) {
    
            int i = 1;
    
            switch (i) {
    
                case 1: {
                    System.out.println("The number is equal to 1");
                }
                case 2: {
                    System.out.println("The number is equal to 2");
                }
                case 3: {
                    System.out.println("The number is equal to 3");
                }
            }
        }
     }

    ونتيجة لذلك، يتعثر التنفيذ من خلال كل خيار ممكن:

    انتاج:

    العدد يساوي 1 العدد يساوي 2 العدد يساوي 3

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

تعليقات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION