Sử dụng của trò chơi này ở Golang


12

Về điều gần nhất Golang có một hướng dẫn về phong cách được tìm thấy ở đây , bên dưới Tên người nhận, điều này được viết:

Tên của người nhận phương thức nên phản ánh bản sắc của nó; thường là một hoặc hai chữ cái viết tắt của loại đủ (chẳng hạn như "c" hoặc "cl" cho "Khách hàng"). Không sử dụng các tên chung chung như "tôi", "này" hoặc "bản thân", các định danh điển hình của các ngôn ngữ hướng đối tượng chú trọng hơn vào các phương thức trái ngược với các hàm. Tên không cần phải được mô tả như của một đối số phương thức, vì vai trò của nó là rõ ràng và không phục vụ mục đích tài liệu.

Cá nhân tôi luôn chỉ sử dụng "cái này" làm định danh vì "cái này" là trọng tâm của những gì tôi đang làm khi viết và chỉnh sửa hàm. Nghe có vẻ đúng, và (với tôi ít nhất) nó có ý nghĩa.

Nếu tên không cần mô tả, vai trò của nó là rõ ràng và nó không phục vụ mục đích tài liệu , tại sao việc sử dụng "cái này" sẽ được tán thành?


3
Câu hỏi tương tự với nhiều câu trả lời hơn: stackoverflow.com/questions/23482068
Trenton

Câu trả lời:


11

Chúng tôi phải yêu cầu tác giả của hướng dẫn phong cách đó biết chắc chắn, nhưng tôi nghĩ lý do chính khiến tôi đồng ý với anh ta là mối liên hệ giữa struct và phương thức lỏng lẻo hơn trong các ngôn ngữ khác .

Về bản chất, khi bạn viết một phương thức như thế này:

func (m *MultiShape) area() float64 {
  ...
}

Điều đó gần như chính xác giống như viết một chức năng như thế này:

func area(m *MultiShape) float64 {
  ...
}

Sự khác biệt duy nhất là một thay đổi cú pháp nhỏ trong cách chúng ta gọi hàm / phương thức.

Trong các ngôn ngữ khác, biến this/ self/ bất cứ thứ gì thường có một số thuộc tính đặc biệt như được cung cấp một cách kỳ diệu bởi ngôn ngữ hoặc có quyền truy cập đặc biệt vào các phương thức riêng tư (hãy nhớ Go không có trường / phương thức riêng tư). Mặc dù "người nhận" vẫn đang được "cung cấp một cách kỳ diệu" ở một mức độ nào đó, nó rất giống với một đối số chức năng thông thường mà nó được cho là không được tính.

Ngoài ra, trong các ngôn ngữ OOP "truyền thống", các phương thức struct / class 'đều đi kèm với định nghĩa struct / class, do đó không thể thêm được từ bên ngoài. Trong Go, theo như tôi biết, bất cứ ai cũng có thể thêm nhiều phương thức vào bất cứ điều gì (tất nhiên là trong phạm vi mã của riêng họ).

Tôi chưa viết đủ Đi để tạo hướng dẫn về phong cách của riêng mình, nhưng cá nhân tôi có thể sử dụng thistrong các phương thức được xác định trong cùng một tệp với cấu trúc họ nhận được và một số tên người nhận mô tả hơn về các phương thức mà tôi đính kèm với các cấu trúc từ các tệp khác .


Đó là một lời giải thích tốt, tôi cho rằng tôi đã quen với C # và các ngôn ngữ OOP khác vì vậy tôi đang trở lại các quy ước mà tôi biết.
Adam

1
@Adam Tôi sẽ tránh thisnếu không vì lý do nào khác ngoài việc tự nhắc nhở bản thân rằng tôi không sử dụng ngôn ngữ OOP truyền thống.
Michael Hampton

4
Không có sự khác biệt thực sự giữa "này" và "người nhận" (và xin vui lòng ngừng lạm dụng từ "ma thuật" - mọi tính năng của ngôn ngữ lập trình cấp cao có thể được gọi là "ma thuật", điều này không làm cho nó trở nên tiêu cực, bạn cố gắng chọn "cái này" để trở thành "ma thuật" vô nghĩa).
mvmn

6

Tôi không bị thuyết phục bởi hướng dẫn phong cách này và tôi không nghĩ bất cứ điều gì tốt hơn this, mehoặc self. Bởi vì this, mehoặc selflàm cho nó siêu rõ ràng rằng biến là một thể hiện của cấu trúc bối cảnh. Tôi không nói rằng một biến tên cấu trúc có vỏ thấp hơn là một ý tưởng tồi, tôi chỉ thích cách thislàm cho nó siêu rõ ràng.


không có lời giải thích, câu trả lời này có thể trở nên vô dụng trong trường hợp nếu người khác đăng một ý kiến ​​trái ngược. Ví dụ: nếu ai đó đăng một yêu cầu như "Tôi bị thuyết phục bởi hướng dẫn phong cách này và tôi nghĩ nó tốt hơn this, mehoặc self" , câu trả lời này sẽ giúp người đọc chọn ra hai ý kiến ​​trái ngược như thế nào? Xem xét chỉnh sửa ing nó thành một hình dạng tốt hơn, để đáp ứng các hướng dẫn Cách trả lời
gnat

Tôi nghĩ rằng tôi đã giải thích rõ ràng những gì tôi muốn nói.
Qian Chen

1
Tôi đồng ý. Tôi nghĩ rằng có quá nhiều bộ não bị đầu độc bởi bối cảnh javascript. Nếu bạn để nó qua một bên. Rằng điều này đề cập đến bối cảnh hiện tại đơn giản hơn nhiều. Và dễ dàng hơn nếu bạn đổi tên các cấu trúc sau này hoặc sao chép phần dán của một triển khai. Công cho dòng tên khó hiểu ngắn hl vv không làm cho nó dễ dàng hơn thế này.
Sentient

0

Đây là từ góc độ của JavaScript, nơi thiscó ý nghĩa từ khóa thực sự đối với trình biên dịch, nhưng theo cách hiểu của tôi, nếu chúng ổn với các chữ viết tắt hai chữ cái cho loại đối tượng, thì nó có thể dễ dàng sử dụng thay thế. Lý do cho sự khác biệt là trong một khối mã không đồng bộ ngày càng sâu hơn, có thể rất dễ hiểu sai "cái này", hoặc người nhận, trong bối cảnh sâu hơn; và có thể nó sẽ không phải là cùng một đối tượng.

Ví dụ, trong JavaScript, một mô-đun điều khiển có thể khởi động một hộp thoại và khai báo một onLoadhàm nội tuyến cho nó. Nhưng tại thời điểm đó, có thể rất dễ để một lập trình viên khác hiểu sai về thisbên trong onLoadđể tham chiếu đến mô-đun điều khiển, chứ không phải hộp thoại; hoặc ngược lại. Điều này có thể tránh được nếu điều khiển được gọi là ctrlvà hộp thoại là dg.


3
Tôi không phải là người hạ cấp, nhưng hầu hết các hành vi khó hiểu thistrong Javascript chỉ đơn giản là không áp dụng cho Go, vì vậy tôi đoán đó là lý do.
Ixrec

@Ixrec Hừm ... được rồi. Tôi đã cố gắng mở rộng nó sang các tình huống mà bạn có thể chọn thistên; chẳng hạn, thường các lập trình viên JS sẽ viết var self = thisđể giữ cùng một tham chiếu xung quanh; nhưng theo hướng dẫn thiết kế của Go, điều đó có thể có cùng các vấn đề nhầm lẫn và về mặt lý thuyết nên sử dụng một tài liệu tham khảo mô tả nhiều hơn.
Katana314
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.