تمرين - إنشاء التعليمات البرمجية باستخدام الأساليب

مكتمل

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

عند استخدام لغة عادية لوصف الخطوات في التعليمات البرمجية، دون الالتزام الصارم بقواعد بناء الجملة، فأنت تستخدم "التعليمات البرمجية الزائفة". يعد الجمع بين الأساليب والرمز الزائف طريقة رائعة لتشغيل بسرعة من خلال أي مهمة برمجة صعبة.

استخدام أساليب لهيكلة التعليمات البرمجية

لنفترض أنك مرشح في مقابلة ترميز. يريد منك المحاور كتابة برنامج يتحقق ما إذا كان عنوان IPv4 صالحا أو غير صالح. يتم منحك القواعد التالية:

  • يتكون عنوان IPv4 صالح من أربعة أرقام مفصولة بنقاط
  • يجب ألا يحتوي كل رقم على أصفار بادئة
  • يجب أن يتراوح كل رقم من 0 إلى 255

1.1.1.1 و255.255.255.255 هي أمثلة على عناوين IP صالحة.

يتم توفير عنوان IPv4 كسلسلة. يمكنك افتراض أنه يتكون فقط من أرقام ونقاط (لا توجد أحرف في السلسلة المتوفرة).

كيف تتعامل مع هذه المهمة؟

إشعار

حتى إذا لم تكن على دراية بعناوين IP، فلا تقلق! لا يزال بإمكانك إكمال التعليمات البرمجية في هذا التمرين باتباع الخطوات.

تقسيم المشكلة

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

  1. في محرر Visual Studio Code، احذف أي تعليمة برمجية موجودة من التدريبات السابقة.

  2. أدخل التعليمات البرمجية الزائفة التالية في المحرر:

    /*
    if ipAddress consists of 4 numbers
    and
    if each ipAddress number has no leading zeroes
    and
    if each ipAddress number is in range 0 - 255
    
    then ipAddress is valid
    
    else ipAddress is invalid
    */
    

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

  3. أدخل سطر تعليمة برمجية فارغا جديدا، ثم اكتب التعليمات البرمجية التالية في المحرر:

    if (ValidateLength() && ValidateZeroes() && ValidateRange()) 
    {
        Console.WriteLine($"ip is a valid IPv4 address");
    } 
    else 
    {
        Console.WriteLine($"ip is an invalid IPv4 address");
    }
    

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

  4. أدخل سطرا جديدا فارغا للتعليمات البرمجية أسفل التعليمات البرمجية الموجودة، ثم اكتب التعليمات البرمجية التالية في المحرر:

    void ValidateLength() {}
    void ValidateZeroes() {}
    void ValidateRange() {}
    

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

تطوير الحل الخاص بك

الآن بعد أن أصبح لديك جميع أساليب العنصر النائب اللازمة لحل المشكلة، يمكنك البدء في التركيز على تفاصيل الحل الخاص بك. ضع في اعتبارك أن تنسيق الإدخال لعنوان IPv4 سيكون سلسلة تتكون من أرقام مفصولة بنقاط. لنبدأ!

  1. في بداية البرنامج، قم بإنشاء متغيرات لتخزين حالات الإدخال والتحقق من الصحة:

    string ipv4Input = "107.31.1.5";
    bool validLength = false;
    bool validZeroes = false;
    bool validRange = false;
    
  2. تحديث التعليمات البرمجية للحل لاستخدام متغيرات التحقق من الصحة كما يلي:

    ValidateLength(); 
    ValidateZeroes(); 
    ValidateRange();
    
    if (validLength && validZeroes && validRange) 
    {
        Console.WriteLine($"ip is a valid IPv4 address");
    } 
    else
    {
        Console.WriteLine($"ip is an invalid IPv4 address");
    }
    
  3. حدّث الأسلوب ValidateLength على النحو التالي:

    void ValidateLength() 
    {
        string[] address = ipv4Input.Split(".");
        validLength = address.Length == 4;
    };
    

    تنص القاعدة الأولى على أن عنوان IPv4 يجب أن يحتوي على أربعة أرقام. لذلك في هذه التعليمات البرمجية، يمكنك استخدام string.Split لفصل الأرقام والتحقق من وجود أربعة منها.

  4. حدّث الأسلوب ValidateZeroes على النحو التالي:

    void ValidateZeroes() 
    {
        string[] address = ipv4Input.Split(".");
    
        foreach (string number in address) 
        {
            if (number.Length > 1 && number.StartsWith("0")) 
            {
                validZeroes = false;
            }
        }
    
        validZeroes = true;
    }
    

    خذ لحظة للنظر في كيفية ترجمة القاعدة إلى التعليمات البرمجية.

    تنص القاعدة الثانية على أن الأرقام في عنوان IPv4 يجب ألا تحتوي على أصفار بادئة. لذلك يحتاج الأسلوب إلى التحقق من الأرقام للأصفار البادئة أثناء القبول 0 كرقم صالح. إذا كانت جميع الأرقام تحتوي على أصفار صالحة، validZeroes يجب أن تكون مساوية ل true، وبخلاف false ذلك. لذلك في هذه التعليمة البرمجية، يمكنك التحقق من أن كل رقم يحتوي على أكثر من رقم واحد لا يبدأ بصفر.

    إذا نظرت عن كثب، فستلاحظ أنه validZeroes تم تعيين إلى true بعد اكتمال الحلقة foreach . ومع ذلك، لا تريد التعيين validZeroes إلا إذا لم يتم العثور على true أصفار بادئة. يمكنك تصحيح هذا الخطأ عن طريق الإعداد validZeroes = true قبل تشغيل التكرار foreach الحلقي. ومع ذلك، يمكنك أيضا تصحيح هذا الخطأ باستخدام عبارة إرجاع .

  5. تحديث التعليمات البرمجية الخاصة بك إلى ما يلي:

    foreach (string number in address) 
    {
        if (number.Length > 1 && number.StartsWith("0")) 
        {
            validZeroes = false;
            return;
        }
    }
    

    تقوم عبارة الإرجاع بإنهاء تنفيذ الأسلوب وإرجاع عنصر التحكم إلى مستدعي الأسلوب. إضافة عبارة return بعد validZeroes = false إنهاء الأسلوب بعد العثور على أول صفر غير صالح. إذا لم يتم العثور على صفر غير صالح، إنهاء الأسلوب بعد تعيين validZeroes إلى true. دعونا ننتقل إلى الأسلوب التالي.

  6. حدّث الأسلوب ValidateRange على النحو التالي:

    void ValidateRange() 
    {
        string[] address = ipv4Input.Split(".");
    
        foreach (string number in address) 
        {
            int value = int.Parse(number);
            if (value < 0 || value > 255) 
            {
                validRange = false;
                return;
            }
        }
        validRange = true;
    }
    

    تنص القاعدة الثالثة على أن كل رقم في عنوان IPv4 يجب أن يتراوح من 0 إلى 255. لذلك في هذه التعليمة البرمجية، يمكنك التحقق من أن كل رقم أقل من 255، وإذا لم يكن الأمر كذلك، فقم بإنهاء التنفيذ بعد تعيين validRange إلى false. نظرا لأن سلسلة الإدخال تحتوي على أرقام ونقاط فقط، فلن تحتاج إلى التحقق من الأرقام السالبة.

    ومع ذلك، قد تكون هناك حالة لا توجد فيها أرقام بين النقاط. على سبيل المثال، "255...255". في هذه الحالة، string.Split(".") سيتم إرجاع إدخالات فارغة، مما int.Parse يؤدي إلى الفشل. يمكنك منع ذلك عن طريق تحديد StringSplitOptions.

  7. تحديث التعليمات البرمجية الخاصة بك كما يلي:

    string[] address = ipv4Input.Split(".", StringSplitOptions.RemoveEmptyEntries);
    

    يؤدي استخدام StringSplitOptions.RemoveEmptyEntries إلى حذف الإدخالات الفارغة address من الصفيف ومنع محاولات تحليل السلاسل الفارغة.

إكمال الحل الخاص بك

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

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

    string ipv4Input = "107.31.1.5";
    
  2. تحديث التعليمات البرمجية كما يلي:

    string[] ipv4Input = {"107.31.1.5", "255.0.0.255", "555..0.555", "255...255"};
    

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

  3. تحديث التعليمات البرمجية الخاصة بك كما يلي:

    foreach (string ip in ipv4Input) 
    {
        ValidateLength(); 
        ValidateZeroes(); 
        ValidateRange();
    
        if (validLength && validZeroes && validRange) 
        {
            Console.WriteLine($"{ip} is a valid IPv4 address");
        } 
        else 
        {
            Console.WriteLine($"{ip} is an invalid IPv4 address");
        }
    }
    

    وأخيرا، تحتاج إلى إصلاح بيانات الإدخال التي يستخدمها ipv4Input كل أسلوب منذ التحديث من سلسلة إلى صفيف. نظرا لأن كل أسلوب يستخدم string.Split، يمكنك الإعلان عن متغير لتخزين نتيجة string.Split واستخدامه في كل أسلوب بدلا من ذلك.

  4. أضف متغيرا لتخزين عنوان IPv4 الحالي الذي سيشير إليه كل أسلوب:

    string[] ipv4Input = {"107.31.1.5", "255.0.0.255", "555..0.555", "255...255"};
    string[] address;
    bool validLength = false;
    bool validZeroes = false;
    bool validRange = false;
    
  5. التهيئة address باستخدام string.Split كما يلي:

    foreach (string ip in ipv4Input) 
    {
        address = ip.Split(".", StringSplitOptions.RemoveEmptyEntries);
    
  6. قم بإزالة المراجع إلى string.Split من كل من أساليب التحقق من الصحة بحيث تستخدم المتغير العمومي address بدلا من ذلك. على سبيل المثال:

    void ValidateLength() 
    {
        validLength = address.Length == 4;
    };
    

التحقق من عملك

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

  1. قارن التعليمات البرمجية بما يلي للتأكد من صحتها:

    string[] ipv4Input = {"107.31.1.5", "255.0.0.255", "555..0.555", "255...255"};
    string[] address;
    bool validLength = false;
    bool validZeroes = false;
    bool validRange = false;
    
    foreach (string ip in ipv4Input) 
    {
        address = ip.Split(".", StringSplitOptions.RemoveEmptyEntries);
    
        ValidateLength(); 
        ValidateZeroes(); 
        ValidateRange();
    
        if (validLength && validZeroes && validRange) 
        {
            Console.WriteLine($"{ip} is a valid IPv4 address");
        } 
        else 
        {
            Console.WriteLine($"{ip} is an invalid IPv4 address");
        }
    }
    
    void ValidateLength() 
    {
        validLength = address.Length == 4;
    };
    
    void ValidateZeroes() 
    {
        foreach (string number in address) 
        {
            if (number.Length > 1 && number.StartsWith("0")) 
            {
                validZeroes = false;
                return;
            }
        }
    
        validZeroes = true;
    }
    
    void ValidateRange() 
    {
        foreach (string number in address) 
        {
            int value = int.Parse(number);
            if (value < 0 || value > 255) 
            {
                validRange = false;
                return;
            }
        }
        validRange = true;
    }
    
  2. احفظ عملك باستخدام Ctrl + S أو باستخدام قائمة Visual Studio Code File.

  3. إذا لزم الأمر، افتح لوحة المحطة الطرفية المتكاملة في Visual Studio Code.

    في لوحة EXPLORER، لفتح Terminal في موقع مجلد TestProject، انقر بزر الماوس الأيمن فوق TestProject، ثم حدد Open in Integrated Terminal.

  4. في موجه الأوامر Terminal، أدخل dotnet run

  5. تحقق من أن التعليمات البرمجية الخاصة بك تنتج الإخراج التالي:

    107.31.1.5 is a valid IPv4 address
    255.0.0.255 is a valid IPv4 address
    555..0.555 is an invalid IPv4 address
    255...255 is an invalid IPv4 address
    

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

خلاصة

إليك ما تعلمته عن استخدام الأساليب حتى الآن:

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