Bài đăng nổi bật


2.  Luyện tập về OOP Composition

2.1  Ex: Ví dụ về hai class Author và Book (Giới thiệu về OOP Composition)

Bài tập đầu tiên này sẽ dẫn bạn qua tất cả các khái niệm liên quan đến Thành phần OOP 
(OOP Composition)
ExerciseOOP_Author.png
Một lớp được gọi Author (như thể hiện trong sơ đồ lớp) được thiết kế để mô hình hóa tác giả của một cuốn sách. Nó chứa:
  • Ba biến private đối tượng: nameString), emailString) và genderchar của một trong hai 'm'hoặc 'f');
  • Một constructor để khởi tạo nameemailvà gendervới các giá trị nhất định;
  • public Author (String name, String email, char gender) {......}
  • (Không có hàm tạo mặc định cho Tác giả, vì không có mặc định cho tên, email và giới tính.)
  • public getters / setters: getName()getEmail()setEmail(), và getGender();
    (Không có setters cho namevà gender, vì những thuộc tính này không thể thay đổi.)
  • Một toString()phương thức trả về " Author[name=?,email=?,gender=?]", ví dụ: " Author[name=Tan Ah Teck,email=ahTeck@somewhere.com,gender=m]".
Viết lớp AuthorĐồng thời viết trình điều khiển thử nghiệm được gọi TestAuthor để kiểm tra tất cả các public phương thức, ví dụ:

Author codeLean = new Author("Code Lean", "codeleanvn@gmail.com", 'm'); // Test the constructor
System.out.println(codeLean);  // Test toString()
codeLean.setEmail("codelean@gmail.com");  // Test setter
System.out.println("name is: " + codeLean.getName());     // Test getter
System.out.println("eamil is: " + codeLean.getEmail());   // Test getter
System.out.println("gender is: " + codeLean.getGender()); // Test gExercise

ExerciseOOP_Book.png
Class Book được thiết kế (như hiển thị trên class diagram) để mô hình hoá một cuốn sách được viết bởi một tác giả one author. Nó chứa:
  • Bốn private instance variables: name (String), author (của class Author mà bạn vừa tạo, lưu ý rằng trong trường hợp này thì mỗi cuốn sách có một và chỉ một tác giả), price(double), và qty (int);
  • Hai hàm tạo (constructor):
  • public Book (String name, Author author, double price) { ...... }
    public Book (String name, Author author, double price, int qty) { ...... }
  • public methods getName()getAuthor()getPrice()setPrice()getQty()setQty().
  • Phương thức toString() sẽ trả về "Book[name=?,Author[name=?,email=?,gender=?],price=?,qty=?".  Bạn có thể tái sử dụng Author’s toString().
Để viết một class Book (có sử dụng class Author được viết trước đó). Đồng thời cũng viết test driver   TestBook để test tất cả các method public trong class Book. Chú ý rằng Book phải có constructor của một instance của lớp Author trước khi bạn có instance của constructor của Book. E.g.,
// Construct an author instance
Author codeLean = new Author("Code Lean", "codeleanvn@gmail.com", 'f');
System.out.println(codeLean);  // Author's toString()

Book dummyBook = new Book("Java for dummy", codeLean, 19.95, 99);  // Test Book's Constructor
System.out.println(dummyBook);  // Test Book's toString()

// Test Getters and Setters
dummyBook.setPrice(29.95);
dummyBook.setQty(28);
System.out.println("name is: " + dummyBook.getName());
System.out.println("price is: " + dummyBook.getPrice());
System.out.println("qty is: " + dummyBook.getQty());
System.out.println("Author is: " + dummyBook.getAuthor());  // Author's toString()
System.out.println("Author's name is: " + dummyBook.getAuthor().getName());
System.out.println("Author's email is: " + dummyBook.getAuthor().getEmail());

// Use an anonymous instance of Author to construct a Book instance
Book anotherBook = new Book("more Java", 
      new Author("Dang Kim Thi", "dangkimthi@gmail.com", 'f'), 29.95);
System.out.println(anotherBook);  // toString()

Hãy lưu ý rằng cả hai lớp Book và Author có một biến được gọi là nameTuy nhiên, nó có thể được phân biệt thông qua thể hiện tham chiếu. Ví dụ Book aBookaBook.name đề cập đến name cuốn sách; trong khi đó Author, ví dụ của một tác giả auAuthoranAuthor.name đề cập đến name tác giả. Không nên đặt tên biến là  bookName và authorName.
THỬ:
  1. In ra name và email của tác giả từ một Book nào đó. (Gợi ý : aBook.getAuthor().getName()aBook.getAuthor().getEmail()).
  2. Giới thiệu các phương pháp mới gọi getAuthorName()getAuthorEmail()getAuthorGender()trong lớp Book để trả lại nameemail và gender các tác giả của cuốn sách. Ví dụ,
  1. public String getAuthorName() {
       return author.getName();
          // cannot use author.name as name is private in Author class
    }

2.2  Luyện Tập (Nâng Cao): Book và Author 

Tiếp tục luyện về Class - trong đó Một mảng của đối tượng coi như một Instance Variable 

ExerciseOOP_BookAuthorAgain.png



Trong bài tập trước , một cuốn sách được viết bởi một và chỉ một tác giả. Trong thực tế, một cuốn sách có thể được viết bởi một hoặc nhiều tác giả. Sửa đổi lớp Book để hỗ trợ một hoặc nhiều tác giả bằng cách thay đổi biến authors thể hiện thành một biến thành một Author mảng.
Ghi chú:
  • Các constructor lấy một mảng Author(ví dụ, Author[]), thay vì một Author thể hiện. Trong thiết kế này, một khi một Book thể hiện là hàm tạo, bạn không thể thêm hoặc xóa tác giả.
  • Các toString()phương pháp sẽ trở lại " Book[name=?,authors={Author[name=?,email=?,gender=?],......},price=?,qty=?]".
Bạn được yêu cầu:
  1. Viết mã cho class BookBạn sẽ sử dụng lại các class  Author được viết trước đó.
  2. Viết trình test driver (được gọi TestBook) để kiểm tra lớp Book.
Gợi ý :


// Declare and allocate an array of Authors
Author[] authors = new Author[2];
authors[0] = new Author("Tan Ah Teck", "AhTeck@somewhere.com", 'm');
authors[1] = new Author("Paul Tan", "Paul@nowhere.com", 'm');

// Declare and allocate a Book instance
Book javaDummy = new Book("Java for Dummy", authors, 19.99, 99);
System.out.println(javaDummy);  // toString()

2.3  Ex: MyPoint Class

ExerciseOOP_MyPoint.png
Một lớp được gọi MyPoint, mô hình điểm 2D và tọa độ, được thiết kế như thể hiện trong sơ đồ lớp. Nó chứa:
  • Hai biến đối tượng xint) và yint).
  • Hàm tạo mặc định (hoặc "không đối số") xây dựng một điểm tại vị trí mặc định của (0, 0).
  • Một hàm tạo quá tải xây dựng một điểm với các tọa độ xvà ytọa độ đã cho.
  • Getter và setter cho các biến thể hiện và biến thể hiện y .
  • Một phương pháp setXY()để đặt cả hai và y.
  • Một phương thức getXY()trả về x và y trong intmảng 2 phần tử .
  • Một toString()phương thức trả về một mô tả chuỗi của thể hiện ở định dạng " ".(xy)


  • Một phương thức được gọi là distance(int x, int y)trả về khoảng cách từ điểm này tới điểm khác tại toạ điển đã cho (x, y), ví dụ

  • MyPoint p1 = new MyPoint(3, 4);
    System.out.println(p1.distance(5, 6));
  • Một ví dụ khác về gọi hàm tính khoảng cách, trong trường hợp này thì x,y của điểm 2 là (5,6)
    MyPoint p1 = new MyPoint(3, 4);
    MyPoint p2 = new MyPoint(5, 6);
    System.out.println(p1.distance(p2));
  • Một ví dụ khác nữa về tính khoảng cách, trong trường hợp này thì x,y của điểm 2 là (0,0)
    MyPoint p1 = new MyPoint(3, 4);
    System.out.println(p1.distance());
Bạn được yêu cầu:
  1. Viết mã cho lớp MyPointCũng viết một chương trình thử nghiệm (được gọi TestMyPoint) để kiểm tra tất cả các phương thức được định nghĩa trong lớp.
    Gợi ý:
  1. // Overloading method distance()
    // This version takes two ints as arguments
    public double distance(int x, int y) {
       int xDiff = this.x – x;
       int yDiff = ......
       return Math.sqrt(xDiff*xDiff + yDiff*yDiff);
    }
      
    // This version takes a MyPoint instance as argument
    public double distance(MyPoint another) {
       int xDiff = this.x – another.x;
       .......
    }
    // Test program to test all constructors and public methods
    MyPoint p1 = new MyPoint();  // Test constructor
    System.out.println(p1);      // Test toString()
    p1.setX(8);   // Test setters
    p1.setY(6);
    System.out.println("x is: " + p1.getX());  // Test getters
    System.out.println("y is: " + p1.getY());
    p1.setXY(3, 0);   // Test setXY()
    System.out.println(p1.getXY()[0]);  // Test getXY()
    System.out.println(p1.getXY()[1]);
    System.out.println(p1);
    
    MyPoint p2 = new MyPoint(0, 4);  // Test another constructor
    System.out.println(p2);
    // Testing the overloaded methods distance()
    System.out.println(p1.distance(p2));    // which version?
    System.out.println(p2.distance(p1));    // which version?
    System.out.println(p1.distance(5, 6));  // which version?
    System.out.println(p1.distance());      // which version? 
    
  2. Viết một chương trình định vị 10 điểm trong một mảng của MyPoint, và khởi (1, 1)(2, 2)... (10, 10).
    Gợi ý : Bạn cần phân bổ mảng, cũng như mỗi trong số 10 MyPoint instance. Nói cách khác, bạn cần phát hành 11 new, 1 cho mảng và 10 cho các MyPoint instance. Write a program that allocates 10 points in an array of MyPoint, and initializes to (1, 1)(2, 2), ... (10, 10).
    Hints: You need to allocate the array, as well as each of the 10 MyPoint instances.  In other words, you need to issue 11 new, 1 for the array and 10 for the MyPoint instances.

  3. MyPoint[] points = new MyPoint[10];  // Declare and allocate an array of MyPoint
    for (int i = 0; i < points.length; i++) {
       points[i] = new MyPoint(...);    // Allocate each of MyPoint instances
    }
    // use a loop to print all the points
    

2.4  Ex: Lớp MyCircle và MyPoint

ExerciseOOP_MyCircle.png
Một lớp được gọi MyCircle, mô hình một vòng tròn với a center (x,y)và a radius, được thiết kế như thể hiện trong sơ đồ lớp. Các MyCircle sử dụng một thể hiện của MyPoint (được tạo trong bài tập trước) như nó center.
Lớp chứa:
  • Hai biến đối tượng privatecenter(một thể hiện của MyPoint) và radiusint).
  • Một hàm tạo xây dựng một vòng tròn với tâm ( xy) và radius.
  • Một hàm tạo quá tải xây dựng một thể hiện đã MyCirclecho MyPointlà centervà radius.
  • Một constructor mặc định xây dựng một vòng tròn có tâm tại (0,0)và bán kính của 1.
  • Getters và setters khác nhau.
  • Một toString()phương thức trả về một mô tả chuỗi của thể hiện này ở định dạng " ". Bạn sẽ tái sử dụng của .MyCircle[radius=r,center=(x,y)]toString()MyPoint
  • getArea()và getCircumference()các phương thức trả về diện tích và chu vi của thisvòng tròn trong double.
  • Một distance(MyCircle another)phương thức trả về khoảng cách của các trung tâm từ thisthể hiện và thể hiện đã cho MyCircleBạn nên sử dụng MyPoint's distance()phương pháp để tính toán khoảng cách này.
Viết MyCirclelớp. Cũng viết một trình điều khiển thử nghiệm (được gọi TestMyCircle) để kiểm tra tất cả các phương thức công khai được định nghĩa trong lớp.
Gợi ý :

// Constructors
public MyCircle(int x, int y, int radius) {
   // Need to construct an instance of MyPoint for the variable center
   center = new MyPoint(x, y);
   this.radius = radius;
}
public MyCircle(MyPoint center, int radius) {
   // An instance of MyPoint already constructed by caller; simply assign.
   this.center = center;
   ......
}
public MyCircle() {
   center = new MyPoint(.....);  // construct MyPoint instance
   this.radius = ......
}

// Returns the x-coordinate of the center of this MyCircle
public int getCenterX() {
   return center.getX();   // cannot use center.x and x is private in MyPoint
}

// Returns the distance of the center for this MyCircle and another MyCircle
public double distance(MyCircle another) {
   return center.distance(another.center); // use distance() of MyPoint
}

2.5  Ex: The MyTriangle and MyPoint Classes

ExerciseOOP_MyTriangle.png
Một lớp được gọi MyTriangle, mô hình một tam giác có 3 đỉnh, được thiết kế như hình. Các MyTrianglelớp học sử dụng ba MyPointtrường hợp (được tạo trong việc thực hiện trước đó) là ba đỉnh của nó.
Nó chứa:
  • Ba privatebiến Ví dụ v1v2v3(trường hợp MyPoint), cho ba đỉnh.
  • Một nhà xây dựng mà xây dựng một MyTrianglevới ba bộ tọa độ, v1=(x1, y1)v2=(x2, y2)v3=(x3, y3).
  • Một constructor quá tải xây dựng MyTriangle với 3 đối tượng MyPoint.
  • Một toString()phương thức trả về một mô tả chuỗi của thể hiện ở định dạng " ".MyTriangle[v1=(x1,y1),v2=(x2,y2),v3=(x3,y3)]
  • Một getPerimeter()phương thức trả về độ dài của chu vi. Bạn nên sử dụng distance()phương pháp chu phương pháp MyPoint để tính toán chu vi.
  • Một phương thức printType()in " equilateral" nếu tất cả ba cạnh bằng nhau ", isosceles" nếu bất kỳ hai trong ba cạnh bằng nhau hoặc " scalene" nếu ba cạnh khác nhau.
Viết class MyTriangleCũng viết một trình điều khiển thử nghiệm (được gọi TestMyTriangle) để kiểm tra tất cả các phương thức được định nghĩa trong lớp.

2.6  Ex: The MyRectangle and MyPoint Classes

Thiết kế một MyRectanglelớp bao gồm hai thiết kế bao gồm haiMyPoint trường hợp là các góc trên cùng bên trái và dưới cùng bên phải của nó . Vẽ sơ đồ lớp, viết mã và viết trình điều khiển kiểm tra.

2.7  Ex: The Customer and Invoice classes

ExerciseOOP_Customer.png
Các Customermô hình lớp khách hàng được thiết kế như thể hiện trong sơ đồ lớp. Viết mã cho Customerlớp và trình điều khiển kiểm tra để kiểm tra tất cả các publicphương thức.
ExerciseOOP_Invoice.png
Các Invoicelớp, thiết kế như thể hiện trong sơ đồ lớp, soạn một Customerví dụ (bằng văn bản trước đó) là thành viên của nó. Viết mã cho Invoicelớp và trình điều khiển kiểm tra để kiểm tra tất cả các publicphương thức.

2.8  Ex: The Customer and Account classes

ExerciseOOP_CustomerAccount.png
Các Customermô hình lớp khách hàng được thiết kế như thể hiện trong sơ đồ lớp. Viết mã cho Customerlớp và trình điều khiển kiểm tra để kiểm tra tất cả các publicphương thức.
ExerciseOOP_AccountCustomer.png
Các Accountmô hình lớp một tài khoản ngân hàng, thiết kế như thể hiện trong sơ đồ lớp, soạn một Customerví dụ (bằng văn bản trước đó) là thành viên của nó. Viết mã cho Accountlớp và trình điều khiển kiểm tra để kiểm tra tất cả các publicphương thức.

Post a Comment

أحدث أقدم