Đây là một vấn đề về lập trình / ngôn ngữ mà tôi muốn nghe suy nghĩ của bạn.
Chúng tôi đã phát triển các quy ước mà hầu hết các lập trình viên (nên) tuân theo đó không phải là một phần của cú pháp ngôn ngữ nhưng phục vụ để làm cho mã dễ đọc hơn. Tất nhiên đây luôn là vấn đề tranh luận nhưng ít nhất có một số khái niệm cốt lõi mà hầu hết các lập trình viên đều thấy dễ chịu. Đặt tên cho các biến của bạn một cách thích hợp, đặt tên nói chung, làm cho các dòng của bạn không quá dài, tránh các hàm dài, đóng gói, những thứ đó.
Tuy nhiên, có một vấn đề mà tôi vẫn chưa tìm thấy ai bình luận và đó có thể là vấn đề lớn nhất. Đó là vấn đề của các đối số là ẩn danh khi bạn gọi một hàm.
Các hàm xuất phát từ toán học trong đó f (x) có ý nghĩa rõ ràng vì một hàm có định nghĩa chặt chẽ hơn nhiều mà nó thường làm trong lập trình. Các hàm thuần túy trong toán học có thể làm ít hơn rất nhiều so với lập trình và chúng là một công cụ tao nhã hơn nhiều, chúng thường chỉ lấy một đối số (thường là một số) và chúng luôn trả về một giá trị (cũng thường là một số). Nếu một hàm có nhiều đối số, thì hầu như chúng luôn chỉ là các chiều bổ sung của miền của hàm. Nói cách khác, một đối số không quan trọng hơn các đối số khác. Chúng được sắp xếp rõ ràng, chắc chắn, nhưng ngoài điều đó, chúng không có thứ tự ngữ nghĩa.
Tuy nhiên, trong lập trình, chúng ta có nhiều chức năng xác định tự do hơn và trong trường hợp này tôi cho rằng đó không phải là một điều tốt. Một tình huống phổ biến, bạn có một hàm được định nghĩa như thế này
func DrawRectangleClipped (rectToDraw, fillColor, clippingRect) {}
Nhìn vào định nghĩa, nếu hàm được viết chính xác, nó hoàn toàn rõ ràng những gì. Khi gọi hàm, bạn thậm chí có thể có một số phép thuật hoàn thành mã / intellisense đang diễn ra trong IDE / trình soạn thảo của bạn sẽ cho bạn biết đối số tiếp theo sẽ là gì. Nhưng chờ đã. Nếu tôi cần điều đó khi tôi thực sự viết cuộc gọi, có phải chúng tôi đang thiếu thứ gì ở đây không? Người đọc mã không có lợi ích của IDE và trừ khi họ chuyển sang định nghĩa, họ không biết cái nào trong hai hình chữ nhật được truyền làm đối số được sử dụng cho mục đích gì.
Vấn đề còn đi xa hơn thế. Nếu các đối số của chúng tôi đến từ một số biến cục bộ, có thể có những tình huống mà chúng tôi thậm chí không biết đối số thứ hai là gì vì chúng tôi chỉ nhìn thấy tên biến. Lấy ví dụ dòng mã này
DrawRectangleClipped(deserializedArray[0], deserializedArray[1], deserializedArray[2])
Điều này được giảm bớt thành nhiều mức độ khác nhau trong các ngôn ngữ khác nhau nhưng ngay cả trong các ngôn ngữ được nhập chính xác và ngay cả khi bạn đặt tên cho các biến của mình một cách hợp lý, bạn thậm chí không đề cập đến loại biến khi bạn chuyển nó vào hàm.
Vì nó thường là với lập trình, có rất nhiều giải pháp tiềm năng cho vấn đề này. Nhiều người đã thực hiện bằng các ngôn ngữ phổ biến. Các tham số được đặt tên trong C # chẳng hạn. Tuy nhiên, tất cả những gì tôi biết đều có nhược điểm đáng kể. Đặt tên cho mọi tham số trên mỗi lệnh gọi hàm không thể dẫn đến mã có thể đọc được. Nó gần như cảm thấy có thể chúng ta vượt xa các khả năng mà lập trình văn bản đơn giản mang lại cho chúng ta. Chúng tôi đã chuyển từ văn bản CHỈ trong hầu hết các lĩnh vực, nhưng chúng tôi vẫn mã giống nhau. Cần thêm thông tin để được hiển thị trong mã? Thêm văn bản. Dù sao, điều này đang có một chút tiếp tuyến vì vậy tôi sẽ dừng ở đây.
Một câu trả lời tôi nhận được với đoạn mã thứ hai là trước tiên bạn có thể giải nén mảng cho một số biến được đặt tên và sau đó sử dụng các biến đó nhưng tên của biến có thể có nghĩa là nhiều thứ và cách nó được gọi không nhất thiết phải nói cho bạn biết cách nó được sử dụng được giải thích trong ngữ cảnh của hàm được gọi. Trong phạm vi cục bộ, bạn có thể có hai hình chữ nhật có tên trái Hình chữ nhật và Hình chữ nhật bên phải bởi vì đó là những gì chúng đại diện về mặt ngữ nghĩa, nhưng nó không cần phải mở rộng cho những gì chúng thể hiện khi được cung cấp cho một hàm.
Trong thực tế, nếu các biến của bạn được đặt tên theo ngữ cảnh của hàm được gọi hơn là bạn giới thiệu ít thông tin hơn khả năng bạn có thể gọi với hàm đó và ở một mức độ nào đó nếu dẫn đến mã kém hơn. Nếu bạn có một quy trình dẫn đến hình chữ nhật mà bạn lưu trữ trong orthForClipping và sau đó một quy trình khác cung cấp orthForDrawing, thì cuộc gọi thực tế đến DrawRonymousClipped chỉ là nghi thức. Một dòng có nghĩa là không có gì mới và chỉ có ở đó để máy tính biết chính xác những gì bạn muốn mặc dù bạn đã giải thích nó với cách đặt tên của bạn. Đây không phải là một điều tốt.
Tôi thực sự thích nghe những quan điểm mới mẻ về điều này. Tôi chắc chắn tôi không phải là người đầu tiên coi đây là một vấn đề, vậy nó được giải quyết như thế nào?