Property vs. private

Mới được chia sẻ cái link trong đó có đoạn code sau.

public class Character : MonoBehaviour
{
    [SerializeField]
    private int maxHealthPoint;
 
    private int healthPoint; // Notice that I removed [SerializeField] on purpose
 
    public int HealthPoint { get { return healthPoint; } }
    public int GetHealthPoint() { return healthPoint; }
 
    public void Damage(float value)
    {
        healthPoint -= value;
        if (healthPoint < 0) 
            healthPoint = 0; 
    } 
    
    public void Heal(float value) 
    { 
        healthPoint += value; 
        if (healthPoint > maxHealthPoint)
            healthPoint = maxHealthPoint;
    } 
}

mục đich của hàm Heal (float value) thay vì public thuộc tính healthPoint và cộng trừ trực tiếp là để đảm bảo healthPoint không vượt quá ngưỡng.

Riêng mình thấy có thể sử dụng property thay vì đống rắc rối đó.

public class Character : MonoBehaviour
{
    private int maxHealthPoint;
   
    private int healthPoint;
    public HealthPoint {
   get =>  healthPoint;
   set {
        healthPoint = Math.Min(maxHealthPoint, healthPoint + value);
   }
   }
}

500 anh em cho ý kiến để mở mang thêm.

Đầu tiên là tiêu đề bài viết đó:

Tại sao nên dùng [SerializeField] thay vì biến public?

Đánh lạc hướng độc giả, thực ra hắn nói về lợi ích của tầm vực là private, SerializeField không liên quan lắm, trong Unity có một công đoạn là serialize để nó hiển thị các field ra editor, dùng SerializeField để bắt nó serialize cả private field, vậy thôi.
(Tác giả bài viết đó có vẻ đang tiếp cận Unity3d theo kiểu học hỏi theo kinh nghiệm, tức là thu thập càng nhiều kinh nghiệm càng tốt chứ không thiên về hệ thống hóa).

Còn vấn đề chính của bạn thì là do Unity3D khi hiển thị class lên editor của nó thì nó không làm việc với property (do property có thể gây ra side effect, thực sự cái này có thể custom lại, nhưng ở đây thì người ta không làm thế).

8 Likes

Bài viết này thiên về Unity3D, không phải chung cho mọi thứ.

2 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?