Tìm hểu về “I” – ISP (Interface Segregation principle)

Thay vì dùng 1 interface lớn, ta nên tách thành nhiều interface nhỏ, với nhiều mục đích cụ thể

Nguyên lý này khá dễ hiểu. Hãy tưởng tượng chúng ta có 1 interface lớn, khoảng 100 methods. Việc implements sẽ khá cực khổ, ngoài ra còn có thể dư thừa vì 1 class không cần dùng hết 100 method. Khi tách interface ra thành nhiều interface nhỏ, gồm các method liên quan tới nhau, việc implement và quản lý sẽ dễ hơn.

Dưới đây minh họa cho một thiết kế sai khi không sử dụng nguyên lý phân tách interface. Các lớp kế thừa interface phải thực thi các phương thức không cần thiết của interface đó.

public interface Animal {
    void fly();
 
    void run();
 
    void bark();
}
 
public class Bird implements Animal {
    public void bark() { /* do nothing */
    }
 
    public void run() {
        // write code about running of the bird
    }
 
    public void fly() {
        // write code about flying of the bird
    }
}
 
public class Cat implements Animal {
    public void fly() {
        throw new Exception("Undefined cat property");
    }
 
    public void bark() {
        throw new Exception("Undefined cat property");
    }
 
    public void run() {
        // write code about running of the cat
    }
}
 
public class Dog implements Animal {
    public void fly() {
    }
 
    public void bark() {
        // write code about barking of the dog
    }
 
    public void run() {
        // write code about running of the dog
    }
}

Bạn có thể dễ dàng thấy ở trên class Dog cũng sẽ implement lại phương thức fly(). Gượm đã Dog cũng có thể fly sao 🙂

Hãy tưởng tượng khi interface Animal ngày càng mở rộng, thì các lớp kế thừa phải tiếp tục implement các phương thức không cần thiết. Đã đến lúc nghĩ đến việc phân tách interface thành các interface nhỏ hơn. Mỗi interface chỉ nên làm những nhiệm vụ có mối liên hệ chặt chẽ với nhau.

Dưới đây là thiết kế sử dụng nguyên lý phân tách interface:

public interface Flyable {
    void fly();
}
 
public interface Runnable {
    void run();
}
 
public interface Barkable {
    void bark();
}
 
public class Bird implements Flyable, Runnable {
    public void run() {
        // write code about running of the bird
    }
 
    public void fly() {
        // write code about flying of the bird
    }
}
 
public class Cat implements Runnable {
    public void run() {
        // write code about running of the cat
    }
}
 
public class Dog implements Runnable, Barkable {
    public void bark() {
        // write code about barking of the dog
    }
 
    public void run() {
        // write code about running of the dog
    }
}

Như vậy, việc mở rộng các interface sẽ không còn là vấn đề.

Bàn thêm vài nguyên lý:

Khi xây dựng một lớp đối tượng, đặc biệt là những lớp trừu tượng (abstract class), nhiều người thường có xu hướng để cho lớp đối tượng thực hiện càng nghiều chức năng càng tốt, đưa thật nhiều thuộc tính và phương thức vào lớp đối tượng đó. Những lớp đối tượng như vậy được gọi là những lớp đối tượng có interface bị “ô nhiễm” (polluted interface).

Khi một lớp đối tượng có interface bị “ô nhiễm”, nó sẽ trở nên cồng kềnh. Một thực thể phần mềm nào đó chỉ cần thực hiện một công việc đơn giản mà lớp đối tượng này hỗ trợ buộc phải làm việc với toàn bộ interface của lớp đối tượng đó. Đặc biệt đối với lớp trừu tượng có interface bị “ô nhiễm”, một số lớp kế thừa chỉ quan tâm đến một phần interface của nó nhưng bị buộc phải thực hiện việc cài đặt cho cả phần interface không hề có ý nghĩa đối với chúng. Điều dẫn đến sự dư thừa không cần thiết trong các thực thể phần mềm. Quan trọng hơn nữa, việc buộc các lớp kế thừa phụ thuộc vào phần interface mà chúng không sử dụng đến sẽ làm tăng sự kết dính (coupling) giữa các thực thể phần mềm. Một khi sự nâng cấp, mở rộng diễn ra, đòi hỏi phần interface đó thay đổi, các lớp kế thừa này bị buộc phải chỉnh sửa. Điều này làm cho chúng vi phạm nguyên lý Open-Close.

Nguyên lý Phân tách interface có mối liên hệ (nhưng không mật thiết lắm) với nguyên lý Open-Close. Sự vi phạm nguyên lý Phân tách interface có khả năng dẫn đến sự vi phạm nguyên lý Open-Close (xem phân tích ở trên).

Interface bị “ô nhiễm” của lớp đối tượng nên được phân tách ngay khi có thể để tránh khả năng dẫn đến sự vi phạm nguyên lý Open-Close. Việc phân tách interface có thể được thể hiện thông qua việc truyền từng tham số riêng, cụ thể vào một hàm hơn là truyền một tham số chung, tổng quát trong khi hàm đó chỉ sử dụng một phần công việc được hỗ trợ bởi tham số chung, tổng quát này. Nó cũng có thể được thể hiện thông qua việc tăng thêm mức độ trừu tượng trong cây kế thừa.

Interface chung của một bộ phận lớp kế thừa được tổng hợp lại trong một lớp cơ sở. Và lớp cơ sở này lại kế thừa từ lớp cơ sở ban đầu. Như vậy những lớp kế thừa khác không bị phụ thuộc vào phần interface mà chúng không sử dụng đến của những lớp kế thừa kia.

Trong trường hợp sau khi phân tách interface, một số lớp kế thừa muốn sử dụng những phần interface đã phân tách, chúng có thể thực hiện việc đa kế thừa từ những lớp hỗ trợ những phần interface này hoặc thực hiện “composition” những đối tượng thuộc những các lớp đó.

Một số bài viết tham khảo

http://laptrinh.vn/d/3839-nguyen-ly-solid-trong-thiet-ke-huong-doi-tuong-p4-interface-sergregation-principle.html
http://codebuild.blogspot.com/2010/09/oop-solid-rules-interface-segregation.html
SOLID design principles in .NET: the Interface Segregation Principle

1- Giới thiệu
Tài liệu này được viết dựa trên:

  • Window 10 (64bit)
  • MySQL Community 5.7.x

2- Sơ lược về các phiên bản của MySQL
Có 2 phiên bản MySQL:

  • MySQL Cummunity
  • MySQL Enterprise Edition

MySQL Cummunity: Là phiên bản miễn phí. (Chúng ta sẽ cài đặt phiên bản này).
MySQL Enterprise Edition: Là phiên bản thương mại.

3- Download MySQL
Chúng ta sẽ download và sử dụng gói MySQL miễn phí.
MySQL Community Server
MySQL Community, sau khi download và cài đặt đầy đủ sẽ bao gồm các phần như hình minh họa dưới đây.
Trong đó có 2 cái quan trọng nhất là:

  • MySQL Server
  • MySQL Workbench (Công cụ trực quan để học và làm việc với MySQL)

huong-dan-cai-dat-va-cau-hinh-mysql-community-1

Trong đó MySQL Workbench đòi hỏi phải cài đặt trước 2 thư viện mở rộng:

Vì vậy đối với các bạn sử dụng windown 7 trở xuống  phải download 2 thư viện này về và cài đặt trước khi bắt đầu cài SQL Community.
Để download MySQL Community, vào địa chỉ:

3.1- Download: MySQL Community Server (GPL)

huong-dan-cai-dat-va-cau-hinh-mysql-community-2

huong-dan-cai-dat-va-cau-hinh-mysql-community-3

huong-dan-cai-dat-va-cau-hinh-mysql-community-4

huong-dan-cai-dat-va-cau-hinh-mysql-community-5

4. Cài đặt

4.1- Cài đặt MySQL Community

huong-dan-cai-dat-va-cau-hinh-mysql-community-6

huong-dan-cai-dat-va-cau-hinh-mysql-community-7

Chọn cài đặt tất cả  bao gồm cả các Database ví dụ (Cho mục đích học tập), hoặc custom (ở đây sẽ chọn full)

huong-dan-cai-dat-va-cau-hinh-mysql-community-8

Bộ cài hiển thị danh sách các gói sẽ được cài vào.

huong-dan-cai-dat-va-cau-hinh-mysql-community-9

huong-dan-cai-dat-va-cau-hinh-mysql-community-10

Bộ cài đặt tiếp tục tới phần cấu hình MySQL Server.

huong-dan-cai-dat-va-cau-hinh-mysql-community-11

huong-dan-cai-dat-va-cau-hinh-mysql-community-12

huong-dan-cai-dat-va-cau-hinh-mysql-community-13

huong-dan-cai-dat-va-cau-hinh-mysql-community-14

huong-dan-cai-dat-va-cau-hinh-mysql-community-15

huong-dan-cai-dat-va-cau-hinh-mysql-community-16

Tiếp tục cấu hình database ví dụ:

huong-dan-cai-dat-va-cau-hinh-mysql-community-17

Nhập vào password và nhấn Check để kiểm tra việc kết nối với MySQL.

huong-dan-cai-dat-va-cau-hinh-mysql-community-18

huong-dan-cai-dat-va-cau-hinh-mysql-community-19

huong-dan-cai-dat-va-cau-hinh-mysql-community-20

huong-dan-cai-dat-va-cau-hinh-mysql-community-21

Nhấn Finish để hoàn thành cài đặt.

huong-dan-cai-dat-va-cau-hinh-mysql-community-22

Cô Lan đã làm việc tại công ty gần 3 năm, nhưng mới đây một nhân viên được tuyển dụng vào sau cô lại được thăng chức, còn cô thì không. Thế rồi một ngày, cô Lan tìm đến ông chủ để nói chuyện.
– “Thưa ông chủ, tôi đã từng đến trễ, về sớm hay bị kỷ luật bao giờ chưa?”.
Ông chủ chỉ đơn giản trả lời:
– “Không có”.
– “Vậy công ty có thành kiến với tôi không?”.
Ông chủ lúc này hơi sững sờ một lúc rồi trả lời:
– “Dĩ nhiên là không”
– “Tại sao người có trình độ chuyên môn thấp hơn cả tôi lại có thể được trọng dụng, mà tôi thì vẫn phải làm một công việc tầm thường?”

Ông chủ im lặng một lúc rồi mỉm cười nói:
– “Việc của cô chúng ta sẽ đợi một lát sẽ bàn, hiện giờ tôi đang có một việc gấp cần xử lý, nếu không cô hãy giúp tôi xử lý việc này trước đã?”
Ông chủ nói tiếp:
– “Một khách hàng sẽ đến công ty để kiểm tra tình trạng sản phẩm, cô hãy liên lạc với họ hỏi xem khi nào họ đến?” “Đây là một nhiệm vụ quan trọng”, – bước ra đến cửa cô còn không quên quay lại cười với ông. Sau 15 phút, cô quay trở lại văn phòng của ông chủ.
Ông chủ hỏi:
– “Cô đã liên hệ được với họ chưa?”
Cô trả lời:
– “Đã liên hệ được với họ rồi nhưng họ nói rằng tuần tới mới có thể qua”.
Ông chủ hỏi tiếp:
– “Cụ thể là vào thứ mấy tuần sau?”
Cô gái ấp úng nói:
– “Cái này tôi chưa hỏi rõ”.
– “Vậy có bao nhiêu người đến?”
– “A! Giám đốc không nhắc tôi hỏi điều này?”
– “Vậy họ đến đây bằng tàu hỏa hay máy bay?”
– “Cái này ngài cũng không nhắc tôi hỏi!”

Ông chủ đã không nói gì nữa, mà thay vào đó gọi một nhân viên khác có tên Trương Thái vào. Anh Trương Thái vào công ty trễ hơn cô một năm, hiện giờ đã là người đứng đầu của một bộ phận. Trương Thái đã nhận nhiệm vụ tương tự như của cô. Sau một lúc anh ấy đã quay lại.
Anh Thái cho biết:
– “Sự việc là như vậy… Họ sẽ đáp máy bay vào 3 giờ chiều ngày thứ sáu tuần sau, khoảng 6 giờ tối sẽ đến đây. Họ có tổng cộng 5 người do trưởng phòng tiêu dùng ông Nam dẫn đầu. Tôi đã báo họ là công ty sẽ cho người ra sân bay để đón”. “Ngoài ra, họ còn có kế hoạch nghiên cứu 2 ngày tại đây. Cụ thể về lịch trình thì sau khi đến đây hai bên sẽ bàn bạc để biết rõ hơn. Để tạo thuận lợi cho công việc, tôi đề xuất sắp xếp họ ở tại khách sạn quốc tế gần đó, nếu ngài đồng ý, ngày mai tôi sẽ đặt phòng trước.” “Còn nữa, trong tuần tới dự báo thời tiết có mưa, tôi sẽ giữ liên lạc với họ bất cứ lúc nào. Nếu tình hình thay đổi, tôi sẽ báo cáo lại cho ngài ngay”.

Sau khi anh Thái rời đi, ông chủ đã quay sang nói với cô gái:
– “Bây giờ chúng ta hãy nói về câu hỏi của cô”
– “Không cần nữa ạ, tôi đã biết lý do, làm phiền ngài rồi.”

Cô chợt hiểu rằng không phải cứ ai đến trước là sẽ đóng một vai trò quan trọng. Mọi người đều bắt đầu từ những điều đơn giản nhất, những việc tưởng như bình thường nhất. Hôm nay bạn tự mình dán những loại nhãn hiệu cho bản thân, có lẽ ngày mai nó sẽ quyết định bạn sẽ được giao cho những trọng trách nhiệm vụ gì. Mức độ quan tâm về công việc sẽ ảnh hưởng trực tiếp đến hiệu quả công việc. Bất kỳ công ty nào cũng cấp bách cần những nhân viên chủ động và có trách nhiệm trong công việc.
Những nhân viên xuất sắc thường không bao giờ thụ động chờ đợi người khác sắp xếp cho công việc. Ngược lại họ sẽ chủ động tìm hiểu những gì họ nên làm, và sau đó tự mình đi hoàn thành tất cả.

cau-chuyen-doi-tang-luong

Nguồn: daynhauhoc.com