แบบฝึกหัด - สร้างรหัสด้วยวิธีการ

เสร็จสมบูรณ์เมื่อ

วิธีการมีประโยชน์สําหรับการจัดระเบียบโค้ด การนําโค้ดกลับมาใช้ใหม่ และเพื่อแก้ไขปัญหาอย่างมีประสิทธิภาพ คุณสามารถนึกภาพวิธีการ เช่น กล่องสีดําที่รับข้อมูลป้อนเข้า ดําเนินการงานที่มีชื่อ และแสดงผลลัพธ์ ด้วยสมมติฐานนี้คุณสามารถจัดโครงสร้างโปรแกรมอย่างรวดเร็วโดยการตั้งชื่องานของคุณเป็นวิธีการแล้วกรอกข้อมูลในตรรกะหลังจากที่คุณระบุงานที่จําเป็นทั้งหมดแล้ว

เมื่อคุณใช้ภาษาธรรมดาเพื่ออธิบายขั้นตอนในโค้ด โดยไม่ต้องปฏิบัติตามกฎไวยากรณ์อย่างเคร่งครัด คุณกําลังใช้ "รหัส pseudo" การรวมวิธีการและโค้ดหลอกเป็นวิธีที่ยอดเยี่ยมในการขับเคลื่อนงานการเขียนโปรแกรมที่ท้าทายอย่างรวดเร็ว

ใช้วิธีการจัดโครงสร้างรหัส

สมมติว่าคุณเป็นผู้สมัครในการสัมภาษณ์เรื่องการเข้ารหัส ผู้สัมภาษณ์ต้องการให้คุณเขียนโปรแกรมที่ตรวจสอบว่าที่อยู่ IPv4 ถูกต้องหรือไม่ คุณได้รับกฎต่อไปนี้:

  • ที่อยู่ IPv4 ที่ถูกต้องประกอบด้วยตัวเลขสี่ตัวที่คั่นด้วยจุด
  • แต่ละตัวเลขต้องไม่มีเลขศูนย์นําหน้า
  • ตัวเลขแต่ละตัวต้องอยู่ในช่วงตั้งแต่ 0 ถึง 255

1.1.1.1 และ 255.255.255.255 เป็นตัวอย่างของที่อยู่ IP ที่ถูกต้อง

ที่อยู่ IPv4 จะแสดงเป็นสตริง คุณสามารถสันนิษฐานได้ว่าจะมีตัวเลขและจุดเท่านั้น (ไม่มีตัวอักษรในสตริงที่ระบุ)

คุณจะเข้าใกล้งานนี้ได้อย่างไร

โน้ต

ถึงแม้ว่าคุณไม่คุ้นเคยกับที่อยู่ IP แต่ไม่ต้องกังวล! คุณยังคงสามารถกรอกรหัสในแบบฝึกหัดนี้ได้โดยทําตามขั้นตอน

ทําลายปัญหา

สําหรับงานนี้ คุณจะต้องระบุขั้นตอนที่จําเป็นในการแก้ไขปัญหา หากคุณดูกฎอย่างใกล้ชิด คุณอาจตระหนักว่าจะใช้เพียงสามขั้นตอนในการพิจารณาว่าที่อยู่ IPv4 ถูกต้องหรือไม่

  1. ใน Visual Studio Code Editor ให้ลบโค้ดที่มีอยู่ออกจากแบบฝึกหัดก่อนหน้า

  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
    */
    

    รหัส Pseudo เป็นวิธีที่ดีในการเริ่มแก้ไขปัญหาใด ๆ เมื่อใช้บล็อกข้อคิดเห็นนี้ คุณจะเชื่อมโยงช่องว่างระหว่างกฎพร้อมท์และรหัสโปรแกรม เพื่อทําให้งานหลักๆ ที่โค้ดของคุณดําเนินการชัดเจนขึ้น โค้ด Pseudo ไม่จําเป็นต้องทํางานหรือปฏิบัติตามกฎไวยากรณ์ อย่างไรก็ตามควรเป็นคําอธิบายที่ชัดเจนว่าโค้ดจะทําอย่างไร ตอนนี้เรามาเปลี่ยนสิ่งนี้เป็นโค้ดจริงกันเถอะ!

  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

  3. หากจําเป็น ให้เปิดแผงเทอร์มินัลแบบรวมของ Visual Studio Code

    ในแผง EXPLORER ในการเปิดเทอร์มินัลที่ตําแหน่งโฟลเดอร์ TestProject ของคุณ ให้คลิกขวาที่ TestProjectจากนั้นเลือก เปิดในเทอร์มินัลแบบรวม

  4. ที่พร้อมท์คําสั่งเทอร์มินัล ให้ใส่ dotnet ทํางาน

  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 สามารถใช้เพื่อยุติการดําเนินการของวิธีการ
  • แต่ละขั้นตอนของปัญหามักจะสามารถแปลเป็นวิธีการของตนเอง
  • ใช้วิธีการแก้ปัญหาเล็ก ๆ เพื่อสร้างโซลูชันของคุณ