Có cách nào để sử dụng hệ thống kiểu Scala để chỉ định chính xác biểu đồ con có liên quan đến ngữ cảnh của một đồ thị đối tượng hoàn chỉnh không?Scala có thể hạn chế đồ thị đối tượng để chỉ những đối tượng có liên quan đến ngữ cảnh có thể nhìn thấy được không?
DCI cho rằng bạn thường có biểu đồ đối tượng khá phức tạp nhưng trong bất kỳ trường hợp sử dụng nào, bạn thường chỉ muốn làm việc với biểu đồ con. Bạn có Foo
có Bar
và Bat
, nhưng khi bạn đang dùng trong trường hợp 1, bạn chỉ quan tâm đến số Bar
và khi trong trường hợp sử dụng 2, chỉ về Bat
.
Ví dụ, giả sử rằng bạn có cấu trúc này, và việc sử dụng hợp cụ thể Role1 đòi hỏi Foo->Bar->Baz->Bin
và Role2 sử dụng hợp cụ thể đòi hỏi Foo->Bat->Baz->Buz
:
class Foo{
val bar = new Bar() //Only relevant to Role 1
val bat = new Bat() //Only relevant to Role 2
}
class Bar {
val baz = new Baz()
}
class Bat {
val baz = new Baz()
}
//Relevant to both Role 1 and 2 (via Bar or Bat)
class Baz {
val bin = new Bin() //Only relevant to Role 1
val buz = new Buz() //Only relevant to Role 2
}
class Bin{}
class Buz{}
Thật dễ dàng để xem làm thế nào bạn có thể hạn chế truy cập trong một lớp đơn bằng cách sử dụng những đặc điểm:
trait FooInRole1 { def bar : Bar } //Define accessor in trait
s/Foo/Foo extends FooInRole1/ //Change Foo's declaration to implement trait
val f : FooInRole1 = new Foo //LHS is i'face, RHS is implementation
//f.bat <--Compile error Irrelevant field is not available. \o/
Nhưng bạn phải lặp lại mô hình này cho tất cả các đối tượng liên quan đến use- trường hợp. (Ví dụ, bạn cần một BazInRole1
để truy cập bin
và BazInRole2
để truy cập biz
)
Câu hỏi của tôi là liệu có một số cách để tránh phải viết tất cả những đặc điểm dễ get-sai, namespace-crowding. Ví dụ, tôi có thể tưởng tượng một cái gì đó giống như mã này (mà không biên dịch):
class Foo[T] {
T match {
case r1 : Role1 => def bar : Bar[T]
case r2 : Role2 => def bat : Bat[T]
case _ => //Nothing
}
}
val fInRole1 = new Foo[Role1] //Provides Foo->Bar->Baz->Bin
val fInRole2 = new Foo[Role2] //Provides Foo->Bat->Baz->Buz
Nó có vẻ như kiểu hệ thống Scala là đủ biểu cảm để làm điều gì đó như thế này, nhưng tôi không thể hình dung nó ra.
Tôi nghĩ rằng một cái gì đó như thế này có thể đạt được với kiểu lớp. Chỉ cần làm cho loại lớp xem trên đồ thị đối tượng và truy cập và thao tác nội dung của nó chỉ thông qua loại lớp. – ziggystar