2013-06-15 39 views
19

Giả sử tôi có một trait trong Scalaquy ước đặt tên Scala của các tính trạng

trait Connection { 

    def init(name: String) 
    def dispose 
} 

Và tôi muốn tạo ra một lớp mà thực hiện nó. Nhưng tôi muốn đặt tên nó là Connection cũng:

class Connection extends Connection { 
    // .... 
} 

Nó sẽ không hoạt động. Tất nhiên, tôi có thể đặt tên là trait một cái gì đó khác, nhưng hóa ra là quy ước đặt tên ở Scala nói rằng tôi nên đặt tên là đặc điểm, nghĩa là không có tiền tố, tôi sẽ sử dụng trong C# (IConnection trong đó IConnection sẽ là interface) .

Và trong trường hợp cụ thể này, tên là Connection cho số classtrait phù hợp hơn.

Hay tôi đã bỏ lỡ điều gì đó trong quy ước đặt tên của Scala?

Trả lời

10

Thực tế là bạn đang trích xuất một API chung thành một đặc điểm Connection có nghĩa là nó sẽ có nhiều triển khai cụ thể. Tất nhiên, những triển khai đó sẽ liên quan đến một số thực thể cụ thể hơn, ví dụ: một cơ sở dữ liệu MySQL hoặc H2.

Có một số phương pháp cho vấn đề của bạn tùy thuộc vào kiến ​​trúc được lựa chọn của ứng dụng của bạn:

  1. Nếu bạn giữ cho việc triển khai cụ thể trong không gian tên cùng bạn nhận được:

    • myApp.Connection

    • myApp.MySqlConnection

    • myApp.H2Connection

  2. Nhưng trên thực sự là nản do dư thừa trong tên (phần *Connection) và giới thiệu một gói mới được khuyến khích, ví dụ:

    • myApp.Connection

    • myApp.connections.MySql

    • myApp.connections.H2

    hoặc

    • myApp.Connection

    • myApp.Connection.MySql

    • myApp.Connection.H2

    nếu bạn chọn để đặt các implemntation cụ thể trong một đối tượng đồng của Connection.

  3. Trong phương pháp tiên tiến hơn để kiến ​​trúc bạn sẽ kết thúc với việc triển khai cụ thể có các gói tin:

    • myApp.Connection

    • myApp.mySql.Connection

    • myApp.h2.Connection

    Và ngay cả ở đây mặc dù bạn có Connection tên đụng độ nó dễ dàng giải quyết được do loại được nằm trong các gói khác nhau bằng cách sử dụng tài liệu tham khảo có trình độ (myApp.Connection) hoặc nhập khẩu có trình độ:

    import myApp.{Connection => GeneralConnection} //or IConnection if you insist 
    
+2

Tôi nghĩ tùy chọn 1 là phổ biến nhất trong thực tế. Tùy chọn 2 là khó hiểu khi bạn đang đọc mã. – monkjack

+1

@monkjack Đúng vậy; Nó có thể cảm thấy như lặp lại cùng một thông tin nhưng mặt khác bạn không thể mong đợi tất cả các nhà phát triển có tất cả bối cảnh gói của tất cả các loại trong đầu của họ – AlexG

4

Các thực tế phổ biến để đặt tên lớp đó cụ một số giao diện/đặc điểm là thêm Impl như postfix (và không thêm bất kỳ tiền tố/postfixes để giao tiếp/đặc điểm):

class ConnectionImpl extends Connection { 
    // .... 
} 

Tại sao? Bởi vì trong mã tốt bạn write functions against interfaces, vì vậy bạn sẽ không polute chức năng của bạn với thoose của tôi:

def sendThings(conn: Connection) { 


} 

so

def sendThings(conn: IConnection) { 


} 

Nếu bạn có nhiều triển khai, điều này, tất nhiên nên Connection đặc điểm, HttpConnection class1, JdbcConnection lớp2.

+3

'HttpUtilImpl',' UserImpl', 'CarImpl' ...?có nghĩa là, tôi nên thêm 'Impl' vào mỗi tên lớp trong mã của tôi, ngay cả khi không có đặc điểm với tên tương tự? Không hợp lý chút nào. –

+0

@MariusKavansky nope, chỉ khi có * đặc điểm và một lớp * tình hình và chúng không khác nhau về tên. –

+0

cũng giống như vậy. như tôi đã nói trong câu hỏi của mình, tôi có thể đặt tên cho đặc điểm (hoặc lớp) một cách khác nhau, nhưng tôi không muốn làm điều đó. –

6

Trong cuốn sách Martin Odersky của có một mẫu với một Rectangle hình chữ nhật mở rộng một đặc tính Rectangular và một lớp Rational mở rộng một đặc tính Ordered. Vì vậy, các mô hình có vẻ ở đây để được sử dụng một tính từ cho tên đặc điểm một chủ đề cho tên lớp. Vì vậy, trong trường hợp của bạn nó sẽ là "lớp kết nối mở rộng kết nối". Ít nhất tôi thích điều này hơn "class ConnectionImpl mở rộng kết nối".

+4

Có thể Kết nối mở rộng Kết nối. Nó có thể không phải luôn luôn được kết nối. –

6

Đó không phải là một quy ước nhưng một cái gì đó được sử dụng trong scala.collection là hậu tố Giống như được sử dụng trong những đặc điểm:

  • SeqLike: Mẫu đặc điểm cho chuỗi kiểu Seq [A].
  • MapLike: Mẫu đặc trưng cho bản đồ, liên kết khóa với giá trị.

Và cứ tiếp tục như vậy.

Tôi đoán đó là cách của họ để nói Hình chữ nhật/Hình chữ nhật trong đó mối quan hệ này (Seq/SeqLike) không có tên rõ ràng.

Các vấn đề liên quan