Danh sách tham số dài so với danh sách biến trạng thái dài


10

Trong một cuốn sách C ++, tác giả nói rằng chúng ta không còn cần một hàm với danh sách tham số dài vì hầu hết các tham số có thể được tái cấu trúc thành các biến trạng thái trong một lớp. Mặt khác, một cuốn sách lập trình chức năng nói rằng các biến trạng thái là xấu vì nó gây ra các tác dụng phụ gây ra lỗi dễ bị lỗi và khó song song mã. Tôi đang bối rối. Mã có nên tránh dựa vào các biến trạng thái càng nhiều càng tốt bằng cách di chuyển biến trạng thái của nó vào danh sách tham số hàm không?


Là cuốn sách gốc nhận xét về C ++ là một ngôn ngữ chức năng?
Martin York

Câu trả lời:


7

Phụ thuộc nếu bạn đang lập trình trong một proceduralhoặc functionalmô hình. Trạng thái có thể thay đổi được yêu cầu cho cái trước và làm tê liệt cho cái sau. Đây là táo và cam. Cả hai đều đúng trong bailiwicks của họ!

Bạn có thể áp dụng chuyển nhượng đơn và các kỹ thuật chức năng khác cho các ngôn ngữ thủ tục bắt buộc, trạng thái bất biến làm cho việc lập trình đồng thời trở nên xác định hơn, nhưng làm cho mọi đối tượng không thể thay đổi trong một ngôn ngữ như Java hoặc C ++ là gần như không thể vì mô hình bộ nhớ của chúng không dễ dàng hỗ trợ mô hình này.


:Cảm ơn! Cuốn sách << 97 điều mọi lập trình viên nên biết >> nói rằng chúng ta nên áp dụng các nguyên tắc lập trình chức năng như tránh tác dụng phụ. Chúng ta có thể áp dụng các nguyên tắc lập trình chức năng trong bối cảnh mã bắt buộc không?
TomCaps

Nhà nước không cần thiết cho lập trình thủ tục. Nó là phổ biến, nhưng không bắt buộc. Điều đó là phổ biến là do thói quen nhiều hơn bất cứ điều gì khác. Mặc dù tôi sẽ thừa nhận rằng chắc chắn có những tình huống trong đó việc giữ một biến (trạng thái) xung quanh dễ dàng hơn các lựa chọn thay thế (ví dụ: xử lý không đồng bộ).
Marjan Venema

@Marjan bất cứ điều gì có biến bất biến là trạng thái

@Jarrod: Bây giờ bạn làm tôi bối rối. Đọc câu trả lời của bạn một lần nữa tôi thấy tôi đã bỏ lỡ "Mutable" trong "Trạng thái Mutable là bắt buộc". Nhưng bình luận của bạn dường như nói rằng có các biến bất biến là trạng thái. Đừng hiểu điều đó. Có thể là do tôi không quen với việc quăng quật và suy nghĩ về sự đột biến và bất biến trong những điều khoản này. Bất kỳ tài liệu tham khảo cho tôi đọc?
Marjan Venema

@MarjanVenema: Có, có các biến không thay đổi là trạng thái. Sự khác biệt trong trạng thái xử lý giữa lập trình thủ tục và chức năng không phải là Proc.prog. có trạng thái, và chức năng không - thay vào đó, sự khác biệt là Proc. ăn xin. có trạng thái có thể thay đổi , trong khi trạng thái luôn bất biến trong lập trình hàm (thuần túy). Xem ví dụ: en.wikipedia.org/wiki/Piously_feftal , giải thích rằng các ngôn ngữ chức năng thuần túy tránh cập nhật.
sleske

1

Nếu tôi hiểu đúng câu hỏi của bạn, bạn đang đặt câu hỏi về những điều kiện đủ điều kiện sử dụng tham số hoặc biến lớp / thành viên / trường / v.v? Tôi giả sử bạn đang đề cập đến một phương thức chứ không phải là một hàm. Nếu đây là về C ++ cụ thể, tôi khuyên bạn nên chuyển câu hỏi của mình sang stack stack.

Một danh sách tham số dài có thể là một dấu hiệu cho thấy bạn có thể cần cấu trúc lại phương thức của mình thành một tập hợp các phương thức chi tiết hơn. Nói chung, việc sử dụng các tham số sẽ làm cho mã của bạn được ghép lỏng hơn. Tôi không chắc liệu điều này có đúng với hầu hết các ngôn ngữ OO hiện đại nữa hay không, nhưng việc tạo đối tượng có thể tốn kém, đặc biệt là nếu có nhiều biến lớp liên quan; vì vậy, nếu các biến lớp của bạn là các đối tượng và được tham chiếu thường xuyên trong một chương trình, thì chúng có thể được coi là biến lớp.

Cũng thế:

  • Các phương thức khác có thể sử dụng các biến lớp không? Nếu có, sau đó xem xét đi với các biến lớp.
  • Là phương pháp của bạn công khai? Nếu công khai, sử dụng tham số.
  • Danh sách tham số của bạn có thể được biểu diễn một cách thích hợp dưới dạng băm / bản đồ / mảng / bộ sưu tập / danh sách / vv không? Nếu vậy, hãy xem nó là một lựa chọn.
  • Là phương pháp của bạn tĩnh? Nếu có, sử dụng tham số.

0

Không, các biến trạng thái trên mỗi se không gây ra tác dụng phụ.

Gọi một phương thức setter (trên cấu trúc dữ liệu có thể nhìn thấy ở nơi khác) một tác dụng phụ.

Bạn có thể có các cấu trúc dữ liệu để ẩn danh sách tham số dài ansd nhưng tránh các tác dụng phụ nếu bạn xây dựng chúng cho phù hợp. Đây là một ví dụ nhỏ (trong Java, chưa được kiểm tra):

class ManyParams {
    final String theName = null;
    final int    theAge = 0:
    ManyParams() {}
    ManyParams(String a, int b) { theName=a; theAge = b; }
    public withName(String n) {
        return new ManyParams(n, this.theAge);
    }
    public withAge(int i) {
         return new ManyParams(theName, i);
    }
}
/// to be used like this
foo(new ManyParams.withName("John").withAge(42));

Tất nhiên, hàm tạo của ManyParams vẫn sẽ có một danh sách tham số dài theo cách này. Nhưng nó ẩn.

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.