Kỹ thuật lập trình này được gọi là gì?


13

Tôi đã xem qua kỹ thuật lập trình này trong khi thực hiện lập trình cặp trong một cuộc phỏng vấn và không thể tìm thấy tên của nó trên google.

Ý tưởng là trước tiên bạn viết biểu thức sử dụng các biến và sau đó bạn viết mã tính toán các biến sau này.

Để sử dụng một số mã ví dụ ở đây:

private bool ValidPolicyNumber(string policyNumber) 
{
    var hasExpectedPrefix = policyNumber.Substring(0,5) == "POLIC";
    var followedBy7Digits = Regex.IsMatch(policyNumber.Substring(6,7), "^[0-9]{7}$");
    var hasLengthOf12 = policyNumber.Length == 12;

    return hasExpectedPrefix && followedBy7Digits && hasLengthOf12;
}

Khi viết hàm này bằng kỹ thuật tôi đã đề cập, trước tiên bạn sẽ viết dòng cuối cùng return hasExpectedPrefix && followedBy7Digits && hasLengthOf12;và sau đó viết 3 dòng đứng trước nó.

Kỹ thuật gần nhất mà tôi có thể tìm thấy là "suy nghĩ mơ ước" và đó là từ SICP nhưng liên quan đến việc gọi các hàm mà bạn sẽ thực hiện sau đó thay vì sử dụng các biến mà bạn sẽ khởi tạo sau.


8
Tôi tin rằng đây chỉ là một hình thức thiết kế từ trên xuống .
Vincent Savard

1
Tôi không biết một tên cụ thể cho nó, nhưng tôi đã thấy điều này khá thường xuyên khi cần kiểm tra một tập hợp các điều kiện phức tạp. Kỹ thuật này làm cho nó dễ dàng hơn để đọc và hiểu các điều kiện phức tạp.
Thất

Tôi đã làm điều này. Bạn sử dụng mã để phác thảo một ý tưởng mà không đổ mồ hôi các chi tiết lúc đầu. Sau đó, IDE phàn nàn rằng một cái gì đó không tồn tại để bạn đi làm cho nó tồn tại. Nó giúp khi bạn có một bài kiểm tra sẽ thất bại cho đến khi bạn hoàn thành.
candied_orange

Nếu điều này được đi trước bởi một thử nghiệm đơn vị thì đó sẽ là Phát triển hướng thử nghiệm. Khi sử dụng TDD tôi biết kết quả mong đợi của mình và tôi làm việc lạc hậu từ hành vi dự kiến ​​đó.
Martin Spamer

Tôi sẽ gọi nó là "viết điều kiện phức tạp hoàn toàn".
Jimmy Breck-McKye

Câu trả lời:


13

Nó chỉ là một biến thể về thành phần chức năng.

Nhân chứng:

private bool ValidPolicyNumber(string policyNumber) 
{
    return hasExpectedPrefix(policyNumber) 
        && followedBy7Digits(policyNumber) 
        && hasLengthOf12(policyNumber);
}

private bool hasExpectedPrefix(string policyNumber)
{
    return policyNumber.Substring(0,5) == "POLIC";
}

private bool followedBy7Digits
{
    return Regex.IsMatch(policyNumber.Substring(6,7), "^[0-9]{7}$");
}

private bool hasLengthOf12
{
    return policyNumber.Length == 12;
}

Sự khác biệt thực sự duy nhất là phiên bản của bạn kết hợp các kết quả được tính toán của các hàm nhỏ hơn thành một phạm vi chức năng duy nhất, đó là những gì bạn muốn trừ khi các biểu thức chức năng nhỏ hơn dự định sẽ được sử dụng lại ở nơi khác.


9

Đây chỉ có thể là một gợi ý từ Clean Code (cuốn sách), được sử dụng khi Phân rã chức năng (như Robert giải thích) không thể áp dụng do các chức năng dẫn đến việc không thể tự sử dụng lại.

Tuy nhiên, nếu bạn muốn có được kỹ thuật về nó, cuốn sách Các mẫu thực hiện , của Kent Beck, đặt tên cho kỹ thuật này là Giải thích các biến cục bộ (nhấn mạnh của tôi):

Biến cục bộ

Các biến cục bộ chỉ có thể truy cập từ điểm khai báo đến cuối phạm vi của chúng. Theo nguyên tắc rằng thông tin nên lan truyền càng ít càng tốt, khai báo các biến cục bộ ngay trước khi chúng được sử dụng và trong phạm vi trong cùng có thể.

Có một số vai trò phổ biến cho các biến cục bộ:

  • Collector: một biến thu thập thông tin để sử dụng sau này. Thông thường nội dung của các bộ sưu tập được trả về là giá trị của hàm. Khi một bộ sưu tập sẽ được trả về, đặt tên cho kết quả hoặc kết quả.

  • Count: một bộ sưu tập đặc biệt thu thập số đếm của một số đối tượng khác.

  • Giải thích: nếu bạn có một biểu thức phức tạp, việc gán các bit của biểu thức cho các biến cục bộ có thể giúp người đọc điều hướng độ phức tạp:

    int top = ...;

    int trái = ...;

    int chiều cao = ...;

    int dưới = ...;

    trả về hình chữ nhật mới (trên cùng, bên trái, chiều cao, chiều rộng);

    Mặc dù không cần thiết về mặt tính toán, nhưng các biến cục bộ giải thích sẽ giúp những gì sẽ là một biểu thức dài và phức tạp.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.