Skip to content

Commit 01f3577

Browse files
committed
updateREADME
1 parent a40a8aa commit 01f3577

File tree

5 files changed

+266
-0
lines changed

5 files changed

+266
-0
lines changed

3. Core Ultilities/StringTips.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@
5151
* ...
5252
*/
5353

54+
@SuppressWarnings("unused")
5455
public class StringTips {
5556
public static void main(String[] args) {
5657
System.out.println("--- String");

README.md

Lines changed: 265 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -800,6 +800,271 @@ public class Dog {
800800

801801
## Ngôn ngữ mô hình hóa thống nhất
802802

803+
Unified Modeling Language (UML) là một công cụ mô hình hóa đồ họa tiêu chuẩn, được thiết kế để phác họa, mô tả và tài liệu về các khía cạnh khác nhau của phần mềm ứng dụng. Nó đặc biệt hữu ích trong lĩnh vực lập trình hướng đối tượng, vì nó cung cấp một cách thức trực quan để thể hiện các lớp, đối tượng, và các mối quan hệ giữa chúng. UML bao gồm nhiều loại sơ đồ khác nhau, nhưng trong bối cảnh lập trình hướng đối tượng, sơ đồ lớp (class diagrams) và sơ đồ tương tác (interaction diagrams) là hai loại được sử dụng phổ biến nhất.
804+
805+
<details>
806+
807+
<summary>Ý nghĩa đối với Lập trình hướng đối tượng</summary>
808+
809+
- UML cho phép lập trình viên mô tả cấu trúc của hệ thống bằng cách sử dụng sơ đồ lớp. Sơ đồ này thể hiện các lớp trong hệ thống, các thuộc tính, phương thức của chúng, và quan trọng nhất là mối quan hệ giữa các lớp như kế thừa, liên kết, tổng hợp và kết hợp. Điều này giúp lập trình viên hiểu và thiết kế hệ thống một cách hệ thống hơn.
810+
811+
- Một khi sơ đồ UML đã được hoàn thiện, nó có thể dùng như là cơ sở để viết mã nguồn. Trong OOP, việc chuyển từ sơ đồ lớp sang mã nguồn (thường là Java, C#, hay C++) là khá trực tiếp, do sự tương đồng giữa các khái niệm mô tả trong UML và cấu trúc lớp trong các ngôn ngữ lập trình này.
812+
813+
- UML giúp định nghĩa rõ ràng các mối quan hệ giữa các đối tượng, làm nổi bật cách thức giao tiếp và tương tác giữa chúng qua sơ đồ tương tác như sơ đồ tuần tự (sequence diagrams) và sơ đồ cộng tác (collaboration diagrams). Điều này giúp lập trình viên hiểu được luồng dữ liệu và kiểm soát trong ứng dụng.
814+
815+
- Trước khi bắt đầu viết mã, UML giúp nhóm phát triển có thể phát hiện và sửa chữa những vấn đề về thiết kế. Sự thống nhất trong cách sử dụng UML còn giúp các thành viên trong nhóm dễ dàng hiểu ý tưởng của nhau, từ đó tăng hiệu quả phối hợp làm việc.
816+
817+
- UML cung cấp tài liệu đầy đủ cho phần mềm, điều này rất hữu ích trong giai đoạn bảo trì và nâng cấp phần mềm. Một sơ đồ UML tốt có thể giúp người mới tham gia dự án nắm bắt nhanh chóng cấu trúc và chức năng của hệ thống.
818+
819+
</details>
820+
821+
<details>
822+
823+
<summary>Sơ đồ lớp</summary>
824+
825+
Class Diagram (Sơ đồ lớp) là một trong những loại sơ đồ được sử dụng trong UML và nó đóng một vai trò quan trọng trong việc mô hình hóa hệ thống phần mềm. Class Diagram cung cấp một cái nhìn tổng quát về cấu trúc của một ứng dụng bằng cách hiển thị các lớp của hệ thống, các thuộc tính và phương thức của chúng, và mối quan hệ giữa các lớp đó. Các mối quan hệ này có thể bao gồm: liên kết (association), kế thừa (inheritance), thực thi (realization), phụ thuộc (dependency), kết tập (aggregation), tổng hợp (composition).
826+
827+
### 1. Ký hiệu lớp
828+
829+
Một lớp đại diện cho một khái niệm bao gồm trạng thái (thuộc tính) và hành vi (phương thức). Mỗi thuộc tính có một kiểu. Mỗi phương thức có một chữ ký. Tên lớp là thông tin bắt buộc duy nhất.
830+
831+
- Tên Lớp: Tên của lớp xuất hiện trong phần đầu tiên.
832+
- Thuộc tính Lớp:
833+
- Các thuộc tính được hiển thị trong phần thứ hai.
834+
- Kiểu thuộc tính được hiển thị sau dấu hai chấm.
835+
- Các thuộc tính tương ứng với các biến thành viên (các thành viên dữ liệu) trong mã.
836+
- Phương thức Lớp (Các phương thức):
837+
- Các phương thức được hiển thị trong phần thứ ba. Đây là các dịch vụ mà lớp cung cấp.
838+
- Kiểu trả về của phương thức được hiển thị sau dấu hai chấm ở cuối chữ ký phương thức.
839+
- Kiểu trả về của các tham số phương thức được hiển thị sau dấu hai chấm theo sau tên tham số. Các phương thức tương ứng với các phương thức lớp trong mã.
840+
841+
Xét ví dụ sau:
842+
843+
<div align = "center">
844+
845+
![Minh họa 1](images/01.png)
846+
847+
</div>
848+
849+
Sơ đồ UML này tương ứng với class `Animal` trong mã như sau:
850+
851+
```java
852+
public class Animal {
853+
// Các thuộc tính của lớp
854+
public String name; // Biến thành viên công khai cho tên
855+
private int age; // Biến thành viên riêng tư cho tuổi
856+
private String species; // Biến thành viên riêng tư cho loài
857+
858+
// Phương thức getter cho thuộc tính name
859+
public String getName() {
860+
return name;
861+
}
862+
863+
// Phương thức setter cho thuộc tính name
864+
public void setName(String name) {
865+
this.name = name;
866+
}
867+
}
868+
```
869+
870+
### 2. Ký hiệu khả năng truy cập
871+
872+
Các ký hiệu `+`, `-``#` đặt trước tên thuộc tính và phương thức trong một lớp biểu thị mức độ khả năng truy cập của thuộc tính và phương thức đó. Cụ thể:
873+
874+
- Dấu `+` biểu thị thuộc tính hoặc phương thức công khai (public).
875+
- Dấu `-` biểu thị thuộc tính hoặc phương thức riêng tư (private).
876+
- Dấu `#` biểu thị thuộc tính hoặc phương thức bảo vệ (protected).
877+
- Nếu không có ký hiệu gì, thì là mặc định (default).
878+
879+
### 3. Ký hiệu quan hệ giữa các lớp
880+
881+
<div align = "center">
882+
883+
![Minh họa 2](images/02.png)
884+
885+
</div>
886+
887+
- Liên kết (Association) là mối quan hệ giữa hai lớp mà trong đó các đối tượng của một lớp kết nối với các đối tượng của lớp kia. Quan hệ này có thể là một chiều hoặc hai chiều.
888+
- Kế thừa (Inheritance) là quan hệ mà một lớp (lớp con) kế thừa các thuộc tính và phương thức từ một lớp khác (lớp cha). Lớp con cũng có thể thêm hoặc ghi đè các phương thức và thuộc tính của lớp cha.
889+
- Thực thi (Realization) là mối quan hệ giữa một lớp và một interface, nơi lớp đảm nhận trách nhiệm triển khai tất cả các phương thức được định nghĩa trong interface đó. Nếu có một interface `Flyable` có phương thức `fly()`, lớp `Bird` có thể thực thi interface này bằng cách triển khai phương thức `fly()`.
890+
- Phụ thuộc (Dependency) xảy ra khi một lớp sử dụng một lớp khác; ví dụ, như là tham số trong một phương thức. Sự thay đổi trong lớp được sử dụng có thể ảnh hưởng đến lớp sử dụng.
891+
- Kết tập (Aggregation) là một dạng đặc biệt của liên kết, mô tả mối quan hệ "có một" (has-a) nhưng không bắt buộc, và các đối tượng tồn tại độc lập với nhau. Một lớp `School` có thể có nhiều đối tượng của lớp `Teacher`, nhưng các giáo viên vẫn tồn tại độc lập với trường học.
892+
- Tổng hợp (Composition) cũng là một dạng đặc biệt của liên kết, thể hiện mối quan hệ "chứa" (contains) giữa các đối tượng, trong đó đối tượng con không tồn tại độc lập khi đối tượng cha bị hủy. Lớp `House` có thể chứa nhiều đối tượng của lớp `Room`. Khi đối tượng `House` bị hủy, các `Room` cũng sẽ bị hủy theo.
893+
894+
Xét ví dụ sau đây:
895+
896+
<div align = "center">
897+
898+
![Minh họa 3](images/03.png)
899+
900+
</div>
901+
902+
Triển khai sơ đồ UML này trong Java như sau:
903+
904+
```java
905+
public class Person {
906+
private String name;
907+
private int age;
908+
private Address address; // Liên kết sử dụng lớp Address
909+
910+
public Person(String name, int age, Address address) {
911+
this.name = name;
912+
this.age = age;
913+
this.address = address;
914+
}
915+
916+
// Getter và Setter cho các thuộc tính
917+
public String getName() {
918+
return name;
919+
}
920+
921+
public void setName(String name) {
922+
this.name = name;
923+
}
924+
925+
public int getAge() {
926+
return age;
927+
}
928+
929+
public void setAge(int age) {
930+
this.age = age;
931+
}
932+
933+
public Address getAddress() {
934+
return address;
935+
}
936+
937+
public void setAddress(Address address) {
938+
this.address = address;
939+
}
940+
}
941+
942+
// Định nghĩa lớp Student kế thừa từ Person
943+
public class Student extends Person {
944+
public Student(String name, int age, Address address) {
945+
super(name, age, address);
946+
}
947+
}
948+
949+
// Định nghĩa lớp Teacher kế thừa từ Person
950+
public class Teacher extends Person {
951+
public Teacher(String name, int age, Address address) {
952+
super(name, age, address);
953+
}
954+
}
955+
956+
// Định nghĩa lớp Staff kế thừa từ Person
957+
public class Staff extends Person {
958+
public Staff(String name, int age, Address address) {
959+
super(name, age, address);
960+
}
961+
}
962+
963+
// Định nghĩa lớp Address
964+
public class Address {
965+
private String street;
966+
private String city;
967+
private String country;
968+
969+
public Address(String street, String city, String country) {
970+
this.street = street;
971+
this.city = city;
972+
this.country = country;
973+
}
974+
975+
// Getter và Setter cho các thuộc tính
976+
public String getStreet() {
977+
return street;
978+
}
979+
980+
public void setStreet(String street) {
981+
this.street = street;
982+
}
983+
984+
public String getCity() {
985+
return city;
986+
}
987+
988+
public void setCity(String city) {
989+
this.city = city;
990+
}
991+
992+
public String getCountry() {
993+
return country;
994+
}
995+
996+
public void setCountry(String country) {
997+
this.country = country;
998+
}
999+
}
1000+
1001+
// Định nghĩa lớp Department chứa Teacher và Course
1002+
public class Department {
1003+
private String name;
1004+
private List<Teacher> teachers; // Aggregation
1005+
private List<Course> courses; // Composition
1006+
1007+
public Department(String name) {
1008+
this.name = name;
1009+
this.teachers = new ArrayList<>();
1010+
this.courses = new ArrayList<>();
1011+
}
1012+
1013+
// Phương thức thêm giáo viên và khóa học
1014+
public void addTeacher(Teacher teacher) {
1015+
teachers.add(teacher);
1016+
}
1017+
1018+
public void addCourse(Course course) {
1019+
courses.add(course);
1020+
}
1021+
}
1022+
1023+
// Định nghĩa lớp Course
1024+
public class Course {
1025+
private String courseName;
1026+
private List<Teacher> teachers; // Association
1027+
1028+
public Course(String courseName) {
1029+
this.courseName = courseName;
1030+
this.teachers = new ArrayList<>();
1031+
}
1032+
1033+
public void addTeacher(Teacher teacher) {
1034+
teachers.add(teacher);
1035+
}
1036+
}
1037+
1038+
// Định nghĩa interface Maintainable
1039+
public interface Maintainable {
1040+
void maintain();
1041+
}
1042+
1043+
// Định nghĩa lớp School
1044+
public class School implements Maintainable {
1045+
private String name;
1046+
private List<Department> departments; // Composition
1047+
1048+
public School(String name) {
1049+
this.name = name;
1050+
this.departments = new ArrayList<>();
1051+
}
1052+
1053+
public void addDepartment(Department department) {
1054+
departments.add(department);
1055+
}
1056+
1057+
// Triển khai phương thức từ interface Maintainable
1058+
@Override
1059+
public void maintain() {
1060+
System.out.println("Maintaining the school facilities...");
1061+
// Logic bảo trì cơ sở vật chất có thể được thực hiện ở đây
1062+
}
1063+
}
1064+
```
1065+
1066+
<details>
1067+
8031068
## Tài liệu tham khảo
8041069

8051070
- Patrick Niemeyer, Jonathan Knudsen; *Learning Java*; Third Edition.

images/01.png

28.5 KB
Loading

images/02.png

48 KB
Loading

images/03.png

95.9 KB
Loading

0 commit comments

Comments
 (0)