Thứ Ba, 8 tháng 1, 2013

Nguyên lý Chia tách Interface

1. Định nghĩa

Nguyên lý Chia tách Interface phát biểu như sau:

Client không nên cố gắng phụ thuộc vào các interface mà nó không sử dụng đến.

2. Giải thích

Interface được hiểu như các hành vi được khai báo và không chứa bất kỳ logic xử lý nào trong các hành vi đó. Interface có thể thừa kế lẫn nhau để tạo thành một cấu trúc hoặc trong 1 interface cũng có thể có khai báo nhiều hành vi khác nhau. Khi một class implement interface thì đồng thời nó cũng phải khai báo các hành vi đã được định nghĩa trong interface đó. Nếu interface đó được kế thừa từ 1 interface cha thì class đó cũng phải khai báo thêm hành vì từ interface cha. Đây là đặc điểm thể hiện tính cấu trúc khi sử dụng đặc tính kế thừa của interface

NHƯNG

Việc các interface kế thừa lẫn nhau hoặc khai báo quá nhiều hành vi trong 1 interface sẽ dẫn đến tình trạng các class khi implement interface đôi lúc sẽ không có nhu cầu sử dụng đến các hành vi mà interface đề cập.

Ví dụ động vật như hổ, rắn, cá, chim có các hành vi như thở, vồ, trườn, bơi, bay....Nếu chúng ta định nghĩa một interface là Animalable thì liệu có hợp lý ???? Khi đó hổ, rắn, cá, chim sẽ implement interface Animalable, và điều gì sẽ xảy ra khi khai báo hành vi trườn hay bơi hoặc bay cho hổ? hành bơi cho chim hay hành vi bay cho cá? Hiển nhiên các động vật nêu trên không thể thực hiện được những hành vi vốn không phải thuộc về nó.

Để giải quyết vấn đề về việc implement thừa các hành vi không sử dụng, chúng ta có thể chia nhỏ các hành vi thành từ interface hoặc xác định nhóm hành vi chắc chắn thuộc một dạng đối tượng nào đó bắt buộc phải có (cần phân tích cẩn thận khi áp dụng mô hình này). Theo đó, chúng ta sẽ có các interface lần lượt thể hiện cho hành vi thở, vồ, trườn bơi...Khi mỗi động vật nào có hành vi nào thì động vật đó sẽ implement interface đó.

Ngoài ra chúng ta có thể căn cứ vào đặc điểm mô tả hành vi của đối tượng mà tạo ra các interface trên cơ sở kế thừa. Ví dụ như interface bò sát thì sẽ kế thừa 2 interface sống trên cạn và sống dưới nước, interface rắn thì sẽ kế thừa các interface trườn, quấn, cắn, nuốt, lột da. Việc tạo ra các interface kế thừa từ các interface khác cần hết sức thận trọng vì nếu phân tích không đủ sâu thì sẽ dẫn đến vi phạm chính nguyên lý chia tách interface.

Xét 1 ví dụ khác, giả sử chúng ta có interface Humanable  (người) và Gunnable (súng). Trong Humanable có 2 hành vi là combat (đánh) và punch (đấm), trong Gunnable có hành vi shoot  (bắn). Như vậy, làm thế nào để một object kiểu người có hành vi bắn. Chúng ta sẽ tạo ra một class Human và implement 2 interface Humanable và Gunnable? Điều này không xảy ra vì thật sự chúng ta sẽ không biết hành vi bắn của con người là gì? Hành vi bắn có ở súng và không có ở người. Để giải quyết vấn đề này, chúng ta sẽ cần đến một dạng pattern là Apdapter, nếu chúng ta cần người có hành vi bắn, trước hết chúng ta sẽ có class Human implement Humanable và Gun implement Gunnable. Sau đó chúng ta sẽ có thêm 1 class là HumanAdapter implement Humanable. Trong HumanAdapter, chúng ta sẽ khai báo interface Gunnable và object nạp vào sẽ là instance (thể hiện) của class Gun (vì class Gun implement interface Gunnable, có thể là class khác nếu class đó implement interface Gunnable), lúc này, chúng ta hoàn toàn có thể sử dụng hành vi shoot trong một object đã implement interface Human nhưng vẫn có hành vi shoot của interface Gunnable. Điều này vẫn tuân thủ nguyên tắc chia tách interface và đảm bảo không implement thừa các hành vi không sử dụng.

3. Ví dụ



1 nhận xét:

  1. Our evaluations are independent and reader-supported and we may receive commissions for suggestions made in 1xbet our website’s guides. There at the moment are|are actually} so many kinds of online roulette that it’s inconceivable to name them all. Many sites have their own takes on VIP Roulette, for instance.

    Trả lờiXóa