-
Design Pattern
- Singleton Design Pattern
- Factory Design Pattern
- Factory Method Design Pattern
- Abstract Factory Design Pattern
- Builder Design Pattern
- Prototype Design Pattern
- Object Pool Design Pattern
- Chain of Responsibility Design Pattern
- Command Design Pattern
- Interpreter Design Pattern
- Iterator Design Pattern
- Mediator Design Pattern
- Memento Design Pattern
- Observer Design Pattern
- Observer Design Pattern - Xử Lý Exception
- Strategy Design Pattern
- Template Method Design Pattern
- Visitor Design Pattern
- Null Object Design Pattern
- Adapter Design Pattern
- Bridge Design Pattern
- Composite Design Pattern
- Decorator Design Pattern
- Flyweight Design Pattern
- Proxy Design Pattern
- S.O.L.I.D
- Clean code
- Lập trình socket
- Java Core
- Multi-Thread
- Spring
- Java Web
- Memory Caching
- Message Queue
- DevOps
- Xây dựng một nền tảng
- MongoDB
- MySQL timestamp
- Properties vs yaml
- Kotlin
- Lập Trình Machine Learning với PyTorch
- Mã Nguồn Mở
- Ezy HTTP
- Free Chat
- Một số kinh nghiệm với Git
- Review cho đồng nghiệp!
- Kinh nghiệm phát triển dự án phức tạp, nhiều người - Tuân thủ
- Kinh nghiệm phát triển dự án phức tạp, nhiều người - Lựa chọn người đi cùng
- Ngành công nghiệp phần mềm tại Việt Nam - Mới chỉ là bắt đầu.
- Ngành công nghiệp phần mềm tại Việt Nam - Dây chuyền sản xuất.
- Ngành công nghiệp phần mềm tại Việt Nam - Thị trường
- Ngành công nghiệp phần mềm tại Việt Nam - Công ăn việc làm
- Setup Dev Environment
- Hello World
- Create a Server Project
- Handle Client Requests
- Using ezyfox-server-csharp-client
- Using ezyfox-es6-client
- Client React.js Interaction
- Build And Deploy In Local
- Tham gia phát triển open source!
- Buôn có bạn, bán có phường
- Đam mê đi đâu rồi?
- Giữa lửa đam mê!
- Tương lai nào cho tester? Thay đổi để dẫn đầu xu thế!
- Tương lai nào cho tester? - Khi thế sự đổi thay!
- Tương lai nào cho lập trình viên? Khi không có hệ quy chiếu!
- Tương lai nào cho lập trình viên - Làm đến bao nhiêu tuổi?
- Tương lai nào cho lập trình viên? Có làm giàu được không?
- Tương lai nào cho lập trình viên? Có cân bằng cuộc sống được không?
- Tương lai nào cho lập trình viên - Nhảy việc đến khi nào?
- Tương lai nào cho lập trình viên - Con đường sự nghiệp (Career path)!
- Tương lai nào cho lập trình viên - Tổng kết lại!
- Con đường sự nghiệp cho lập trình viên - Giai đoạn sơ cấp (Junior)!
- Con đường sự nghiệp cho lập trình viên - Giai đoạn trung cấp (Intermediate)!
- Con đường sự nghiệp cho lập trình viên - Giai đoạn lành nghề (Senior)!
- Giai đoạn lành nghề (Senior) - Giữa những hoang mang!
- Giai đoạn lành nghề (Senior) - Phân hoá trong doanh nghiệp!
- Con đường sự nghiệp cho lập trình viên - Trở thành chuyên gia (Expert)!
- Con đường sự nghiệp cho lập trình viên - Trở thành người ảnh hưởng (Influencer)!
- Các giai đoạn phát triển của lập trình viên - Tổng kết lại!
- Metaverse - Câu chuyện 10 nghìn CCU (Người tham gia đồng thời)
- Metaverse có khả thi ở Việt Nam?
- Lựa chọn nghề nghiệp - DevOps!
- Lựa chọn nghề nghiệp - Project Manager (PM)!
- Lựa chọn nghề nghiệp - Data Engineer!
- Lựa chọn nghề nghiệp - BackEnd Engineer!
- “Talk is cheap. Show me the code” ― Linus Torvalds
- Lựa chọn nghề nghiệp - Web Front-End Engineer!
- Lựa chọn nghề nghiệp - Mobile Engineer!
- Lựa chọn nghề nghiệp - Game Engineer!
- Lựa chọn nghề nghiệp - Product Owner!
- Tuổi trẻ cần đột phá!
- Tuổi trẻ cần sự đồng cảm!
- Tuổi trẻ - điều đáng sợ đầu tiên là gì?
- Tuổi trẻ - Điều đáng sợ thứ 2 là gì?
- Tuổi trẻ - Điều đáng sợ thứ 3 là gì?
- Tuổi trẻ - Điều đáng sợ thứ 4 là gì?
- Nếu tận dụng hết năng lực thì sẽ thế nào?
- Tuổi trẻ - Điều đáng sợ thứ 5 là gì?
- Tuổi trẻ - Điều đáng sợ thứ 6 là gì?
- Tuổi trẻ - Điều đáng sợ thứ 7 là gì?
- Tuổi trẻ - ham học hỏi là như thế nào?
- Đầu tư cho bản thân là gì?
- Học chủ động!
- Có nên quay lại công ty cũ?
- Làm cho startup (công ty nhỏ) hay làm cho công ty lớn? (Phần 1)
- Làm cho startup (công ty nhỏ) hay làm cho công ty lớn? (Phần 2)
- Làm cho startup (công ty nhỏ) hay làm cho công ty lớn? (Phần 3)
- Tự học
- Học tập tại doanh nghiệp
- Học tại trung tâm
- Cách đọc sách kỹ thuật hiệu quả
- Học trong một tổ chức mã nguồn mở.
- Câu chuyện lập trình viên - Công việc đầu tiên
- Câu chuyện lập trình viên - Mức lương đầu tiên
- Câu chuyện lập trình viên - 2018
- Định hướng là gì?
- Wordpress nguy hiểm thế nào?
- Danh sách 10 trung tâm đào tạo trình uy tín, chất lượng ở Hà Nội
Thông dịch viên không cần lương
Có bao giờ bạn tự hỏi các ứng dụng dịch như google translate, hay các ngôn ngữ thông dịch như javascript hoạt động như thế nào chưa? Đó là một trong những ứng dụng rất quan trọng của Interpreter. Nó như một thông dịch viên cần mẫn, luôn cố gắng dịch mọi ngôn ngữ đầu vào và đưa ra kết quả chính xác, và đặc biệt nó có thể sống mà không cần phải được trả lương.
Sơ đồ lớp
Liệu có phải bên trong các ứng dụng dịch ngôn ngữ sẽ code kiểu như thế này không?
if (inputLanguage = "en") {
if(outputLanguage = "vi") {
if(inputText = "hello") {
return "xin chao";
}
}
}
Chắc chắn là không phải rồi, họ cần một thiết kế mềm dẻo và có khả năng mở rộng hơn thế này rất nhiều.
Đây là sơ đồ lớp mình tham khảo ở wiki, cá nhân mình thấy nó hơi khó hiểu, nhưng nó xuất hiện ở nhiều tài liệu khác nữa nên mình sẽ bám theo nó nhé.
Các lớp thành phần trong sơ đồ bao gồm:
- Client: là lớp sử dụng interpreter design pattern
- Context: là lớp được tạo bởi client và được truyền vào interpreter, nó chưa dữ liệu đầu vào và kết quả đầu ra.
- AbstractExpression: là lớp cơ sở chứa hàm
interpret
,Client
sẽ sử dụng lớp này thay vì các lớp cài đặt cụ thể - TerminalExpression: là lớp thừa kế
AbstractExpression
và cài đặt hàminterpret
, trong thực tế sẽ có rất nhiề lớpTerminalExpression
- NonterminalExpression: là lớp thừa kế
AbstractExpression
, tuy nhiên nó sẽ có nhiều lớp con và gọi các lớp con này trong hàm cài đặtinterpret
Mục tiêu ra đời
Với cú pháp phức tạp if else
như ví dụ ở trên thì rất khó để chúng ta có thể tạo ra được một ứng dụng từ điển trong thực tế, vậy nên interpreter
ra đời hướng đến các mục tiêu:
- Tạo ra một mô hình mà người sử dụng chỉ cần quan tâm đến dữ liệu đầu vào và nhận dữ liệu đầu ra
- Tạo ra các lớp cài đặt hàm
interpret
, giảm bớt các câu lệnh rẽ nhánhif else
, từ đó tăng khả năng mở rộng về sau này
Ví dụ
Trở lại với ứng dụng dịch, chúng ta sẽ cung cấp tính năng dịch từ tiếng Anh sang tiếng Vệt và ngược lại từ tiếng Việt sang tiếng Anh, hãy thiết kế sơ đồ lớp một chút nhé
Sơ đồ lớp
- Lớp LanguageTranslator: đóng vai trò là lớp
Client
, sẽ tạo ra đối tượngLanguageTranslateRequest
và truyền nó vào cho các lớpinterpreter
. Lớp này sẽ chứa một danh sách cácinterprerter
tương ứng với ngôn ngữ đầu vào và đầu ra. - LanguageTranslateRequest: chứa thông tin ngôn ngữ đầu vào, ngôn ngữ đầu ra và văn bản cần dịch, nó tương ứng với lớp
Context
trong mô hình tiêu chuẩn - LanguageInterperter: là interface cơ sở chứa hàm
interpreter
, hơi khác một chút so với mô hình tiêu chuẩn, đó là hàm này chỉ yêu cầu 1 văn bản đầu vào và trả lại văn bản kết quả đầu ra chứ không cần sử dụng đến đối tượngLanguageTranslateRequest
, lớp này tương ứng vớiAbstractExpression
- LanguageEnglishToVietnameseInterpreter: là lớp chịu trách nhiệm dịch từ tiếng anh sang tiếng Việt, lớp này tương ứng với
TermialExpression
- LanguageVietnameseToEnglishInterpreter: là lớp chịu trách nhiệm dịch từ tiếng Việt sang tiếng anh, lớp này cũng tương ứng với
TermialExpression
Một chút code
Source code đầy đủ các bạn có thể tham khảo tại Github, ở đây mình sẽ chỉ viết ra một số đoạn chính thôi nhé:
Lớp LanguageTranslator
public class LanguageTranslator {
private final Map<LanguageType, Map<LanguageType, LanguageInterperter>> interperters;
public String translate(LanguageTranslateRequest request) {
return interperters
.get(request.getInputLanguageType())
.get(request.getOutputlLanguageType())
.interpreter(request.getText());
}
public static void main(String[] args) {
LanguageTranslator translator = new LanguageTranslator();
String englishText = "hello";
String translatedVietnameseText = translator.translate(
new LanguageTranslateRequest(
LanguageType.EN,
LanguageType.VI, englishText
)
);
System.out.println("English text: " + englishText);
System.out.println("Vietnamese text: " + translatedVietnameseText);
String vietnamesesText = "chao buoi sang";
String translatedEnglishText = translator.translate(
new LanguageTranslateRequest(
LanguageType.VI,
LanguageType.EN, vietnamesesText
)
);
System.out.println("Vietnamese text: " + vietnamesesText);
System.out.println("English text: " + translatedEnglishText);
}
}
lớp LanguageTranslateRequest
public class LanguageTranslateRequest {
private final LanguageType inputLanguageType;
private final LanguageType outputlLanguageType;
private final String text;
}
Interface LanguageInterperter
public interface LanguageInterperter {
String interpreter(String input);
}
Lớp LanguageEnglishToVietnameseInterpreter
public class LanguageEnglishToVietnameseInterpreter implements LanguageInterperter {
private Map<String, String> dictionary;
@Override
public String interpreter(String input) {
return dictionary.get(input);
}
}
Lớp LanguageVietnameseToEnglishInterpreter
public class LanguageEnglishToVietnameseInterpreter implements LanguageInterperter {
private Map<String, String> dictionary;
@Override
public String interpreter(String input) {
return dictionary.get(input);
}
}
Theo mô hình này, mỗi cặp ngôn ngữ sẽ có một lớp dịch riêng biệt, chính vì vậy mà chúng ta có thể thêm bao nhiêu cặp ngôn ngữ tuỳ ý mà không làm ảnh hưởng tới chương trình đang chạy. Thêm vào nữa chúng ta có thể chia thành nhiều đội cùng phát triển đồng thời mà không làm ảnh đến nhau.
Tổng kết
Nếu bạn đang có ý định viết một ứng dụng dịch, hay một ngôn ngữ lập trình mới, interpreter sẽ là một lựa chọn rất tuyệt vời cho bạn, ngoài ra interpreter cũng được ứng dụng để thông dịch dữ liệu từ dạng A thành dạng B giữa các tầng, ví chuyển đổi đối tượng sang mảng byte hay ngược lại, đây đều là những thứ khá quen thuộc với chúng ta.
Tham khảo
-
Design Pattern
- Singleton Design Pattern
- Factory Design Pattern
- Factory Method Design Pattern
- Abstract Factory Design Pattern
- Builder Design Pattern
- Prototype Design Pattern
- Object Pool Design Pattern
- Chain of Responsibility Design Pattern
- Command Design Pattern
- Interpreter Design Pattern
- Iterator Design Pattern
- Mediator Design Pattern
- Memento Design Pattern
- Observer Design Pattern
- Observer Design Pattern - Xử Lý Exception
- Strategy Design Pattern
- Template Method Design Pattern
- Visitor Design Pattern
- Null Object Design Pattern
- Adapter Design Pattern
- Bridge Design Pattern
- Composite Design Pattern
- Decorator Design Pattern
- Flyweight Design Pattern
- Proxy Design Pattern
- S.O.L.I.D
- Clean code
- Lập trình socket
- Java Core
- Multi-Thread
- Spring
- Java Web
- Memory Caching
- Message Queue
- DevOps
- Xây dựng một nền tảng
- MongoDB
- MySQL timestamp
- Properties vs yaml
- Kotlin
- Lập Trình Machine Learning với PyTorch
- Mã Nguồn Mở
- Ezy HTTP
- Free Chat
- Một số kinh nghiệm với Git
- Review cho đồng nghiệp!
- Kinh nghiệm phát triển dự án phức tạp, nhiều người - Tuân thủ
- Kinh nghiệm phát triển dự án phức tạp, nhiều người - Lựa chọn người đi cùng
- Ngành công nghiệp phần mềm tại Việt Nam - Mới chỉ là bắt đầu.
- Ngành công nghiệp phần mềm tại Việt Nam - Dây chuyền sản xuất.
- Ngành công nghiệp phần mềm tại Việt Nam - Thị trường
- Ngành công nghiệp phần mềm tại Việt Nam - Công ăn việc làm
- Setup Dev Environment
- Hello World
- Create a Server Project
- Handle Client Requests
- Using ezyfox-server-csharp-client
- Using ezyfox-es6-client
- Client React.js Interaction
- Build And Deploy In Local
- Tham gia phát triển open source!
- Buôn có bạn, bán có phường
- Đam mê đi đâu rồi?
- Giữa lửa đam mê!
- Tương lai nào cho tester? Thay đổi để dẫn đầu xu thế!
- Tương lai nào cho tester? - Khi thế sự đổi thay!
- Tương lai nào cho lập trình viên? Khi không có hệ quy chiếu!
- Tương lai nào cho lập trình viên - Làm đến bao nhiêu tuổi?
- Tương lai nào cho lập trình viên? Có làm giàu được không?
- Tương lai nào cho lập trình viên? Có cân bằng cuộc sống được không?
- Tương lai nào cho lập trình viên - Nhảy việc đến khi nào?
- Tương lai nào cho lập trình viên - Con đường sự nghiệp (Career path)!
- Tương lai nào cho lập trình viên - Tổng kết lại!
- Con đường sự nghiệp cho lập trình viên - Giai đoạn sơ cấp (Junior)!
- Con đường sự nghiệp cho lập trình viên - Giai đoạn trung cấp (Intermediate)!
- Con đường sự nghiệp cho lập trình viên - Giai đoạn lành nghề (Senior)!
- Giai đoạn lành nghề (Senior) - Giữa những hoang mang!
- Giai đoạn lành nghề (Senior) - Phân hoá trong doanh nghiệp!
- Con đường sự nghiệp cho lập trình viên - Trở thành chuyên gia (Expert)!
- Con đường sự nghiệp cho lập trình viên - Trở thành người ảnh hưởng (Influencer)!
- Các giai đoạn phát triển của lập trình viên - Tổng kết lại!
- Metaverse - Câu chuyện 10 nghìn CCU (Người tham gia đồng thời)
- Metaverse có khả thi ở Việt Nam?
- Lựa chọn nghề nghiệp - DevOps!
- Lựa chọn nghề nghiệp - Project Manager (PM)!
- Lựa chọn nghề nghiệp - Data Engineer!
- Lựa chọn nghề nghiệp - BackEnd Engineer!
- “Talk is cheap. Show me the code” ― Linus Torvalds
- Lựa chọn nghề nghiệp - Web Front-End Engineer!
- Lựa chọn nghề nghiệp - Mobile Engineer!
- Lựa chọn nghề nghiệp - Game Engineer!
- Lựa chọn nghề nghiệp - Product Owner!
- Tuổi trẻ cần đột phá!
- Tuổi trẻ cần sự đồng cảm!
- Tuổi trẻ - điều đáng sợ đầu tiên là gì?
- Tuổi trẻ - Điều đáng sợ thứ 2 là gì?
- Tuổi trẻ - Điều đáng sợ thứ 3 là gì?
- Tuổi trẻ - Điều đáng sợ thứ 4 là gì?
- Nếu tận dụng hết năng lực thì sẽ thế nào?
- Tuổi trẻ - Điều đáng sợ thứ 5 là gì?
- Tuổi trẻ - Điều đáng sợ thứ 6 là gì?
- Tuổi trẻ - Điều đáng sợ thứ 7 là gì?
- Tuổi trẻ - ham học hỏi là như thế nào?
- Đầu tư cho bản thân là gì?
- Học chủ động!
- Có nên quay lại công ty cũ?
- Làm cho startup (công ty nhỏ) hay làm cho công ty lớn? (Phần 1)
- Làm cho startup (công ty nhỏ) hay làm cho công ty lớn? (Phần 2)
- Làm cho startup (công ty nhỏ) hay làm cho công ty lớn? (Phần 3)
- Tự học
- Học tập tại doanh nghiệp
- Học tại trung tâm
- Cách đọc sách kỹ thuật hiệu quả
- Học trong một tổ chức mã nguồn mở.
- Câu chuyện lập trình viên - Công việc đầu tiên
- Câu chuyện lập trình viên - Mức lương đầu tiên
- Câu chuyện lập trình viên - 2018
- Định hướng là gì?
- Wordpress nguy hiểm thế nào?
- Danh sách 10 trung tâm đào tạo trình uy tín, chất lượng ở Hà Nội