Assignment 2 Phase 3 Checklist

Nếu bạn chưa hoàn thành A2P1 hoặc A2P2 thì có thể xem lại 2 bài viết sau:

Assignment 2 Phase 1 Checklist

Assignment 2 Phase 2 Checklist

Không thì nếu muốn làm luôn mà bỏ qua A2P2 cũng được (vì cũng không liên quan nhiều lắm)

Rất dễ dàng để thấy được, màn 2 cảnh 3 (A2P3) đơn giản hơn màn 2 cảnh 2 (A2P2) nhiều (không biết là do đơn giản thiệt, hay là do khái niệm “đơn giản” con người đã thay đổi sau A2P2). Và sau khi hoàn thành A2P2 thì bạn cũng đã có một kiến trúc chương trình khá chắc chắn và đã xây dựng riêng cho mình một phong cách lập trình nhất định. Nên bài viết này sẽ ngắn thôi!

Một số điều cần quan tâm trong A2P3 là:
Testcase của A2P3 cũng chỉ chứa tối đa 1 lỗi, vậy nên cũng không cần quan tâm đế thứ tự ưu tiên của các lỗi,

1. Thừa kế

Trong A2P3 bạn sẽ cần hiện thực phần thừa kế (đáng lẽ ra phải hoàn thành trong A2P2 nhưng được bỏ qua),
Khi “class B extends A {}” có nghĩa là:

  • class B sẽ có tất cả thuộc tính và phương thức của class A (tất nhiên là cả cha của A, tổ tiên của A),
  • tuy nhiên vẫn có thể khai báo lại (override),
  • một điều cần chú ý khi override phương thức là phải đầy đủ bao gồm cả prototype và implementation, không thì vẫn báo lỗi như thường!

Hơn thế nữa nếu có thêm “class C extends B {}” thì có nghĩa là

a:A;
c:C;
a:=new C();
a:=c;

vẫn hợp lệ khi tính tới chuyện tương thích kiểu (vì A cũng là superclass của C), vậy khi xét tương thích kiểu phải xét lên cả tổ tiên.

2. Lỗi No Prototype/No Implementation:

Khi một phải được và chỉ cần khai báo trước khi sử dụng.
Các tiền khai báo phải được hiện thực đầy đủ, trước khi kết thúc chương trình.

Các sai lầm thường gặp:

Khi xuất hiện lời gọi hàm, mà hàm chưa được hiện thực thì báo Undeclared Method.
Khi xuất hiện lời gọi hàm, mà hàm chưa được hiện thực thì báo No Implementation.

Gợi ý:

Một hàm khi được đem ra sử dụng thì ít nhất phải được prototype trước đó! Việc này đồng nghĩa với chuyện khi lời gọi hàm (call expression, call statement, new expression) xuất hiện mà không thấy prototype tương ứng thì sẽ báo Undeclared Method.
Method không nhất thiết phải được Implementation khi được gọi (sẽ không phát sinh ra lỗi nếu đã được Prototype)
Vì không có cách nào để Implementation trước Prototype (đơn giản thì bạn cứ hiểu như vậy đi, giải thích có lẽ hơi dài dòng), nên khi Implementation mà không tìm thấy Prototype tương ứng thì có thể báo là No Prototype.
Chỉ nên kiểm tra No Implementation khi đã visit xong hết các Declaration của chương trình, vào lúc này, nếu có Method nào chỉ có Prototype thì sẽ báo lỗi No Implementation (không cần kiểm tra No Prototype vì đã kiểm tra ở bước trước)

3. Lỗi Cannot Access Private Attribute:

Mặc định modifier của các thuộc tính (Attribute) của class là Private (và không có cách nào thay đổi được điều này).
Vì vậy các thuộc tính của một class chỉ có thể được truy xuất bởi chính nó (trong class Scope, trong method Scope của method chứa trong class Scope) hoặc thông qua các đối tượng cùng kiểu.

Các sai lầm thường gặp:

có thể truy xuất thuộc tính của biến kiểu class cha, class tổ tiên của nó.

Gợi ý:

Trong FieldAccess kiểm tra kiểu của name, nếu name là kiểu khác với class đang gọi nó thì báo lỗi!

4. Lỗi Method Not Return:

Trong phần này còn tồn tại nhiều vấn đề khá nhức nhối, sẽ được cập nhật và bổ sung sau, nhưng trước hết cần chú ý:
Không cần xét điều kiện của If, Repeat, While, cũng như biểu thức của For, vì thế:
Trong If, cả 2 luồng chạy đều phải được return, sẽ báo lỗi “Method Not Return” trong trường hợp một trong 2 vế Else hoặc Then không return hoặc thiếu vế Else.
Không cần xét vòng lặp For, While vì không thể kiểm tra điều kiện, và nó có thể sẽ không được thực hiện. Riêng Repeat vẫn phải xét vì sẽ chạy ít nhất 1 lần!
Cần chú ý về break và continue statement, các return sau nó sẽ trở nên vô nghĩa, (trong cùng scope của vòng lặp)
Còn các vấn đề khác mình sẽ cập nhật trong thời gian sớm nhất!

-anKra-

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s