Tại sao nên dùng serializefield thay vì biến public

9 178 0
Tại sao nên dùng serializefield thay vì biến public

Đang tải... (xem toàn văn)

Thông tin tài liệu

Cách đây độ hơn một năm, mình có viết một bài giải thích về thẻ SerializeField trong Unity C hoạt động như thế nào. Trong bài đó, mình có nói rằng các trường dữ liệu public có thể là những mối nguy tiềm ẩn trong chương trình của bạn. Với các lập trình viên có kinh nghiệm, việc này khá là hiển nhiên, như kiểu trái đất quay quanh mặt trời vậy.

Tại nên dùng [SerializeField] thay biến public? 5949 Mục lục nội dung Hàng công cộng tức công chúng xài Đẹp khoe xấu che Kết Cách độ năm, có viết giải thích thẻ [ SerializeField ] Unity C# hoạt động Trong đó, có nói trường liệu public mối nguy tiềm ẩn chương trình bạn Với lập trình viên có kinh nghiệm, việc hiển nhiên, kiểu trái đất quay quanh mặt trời Có thể bạn muốn xem: Cách cài đặt cấu hình máy tính cá nhân thành public server Internet Vì tơi chuyển từ Visual Studio Code sang Sublime Text Tuy nhiên, với bạn newbie bạn tự học lập trình nhà, nguy đến từ biến public chẳng đáng lo ngại Trong viết giải thích kỹ quan điểm mình, bạn thấy nhiều lập trình viên khác có chung quan điểm đó.ư Những việc làm hấp dẫn  Senior non-hlos Android Engineer Công Ty Cổ Phần G-Innovations Việt NamHNNegotiable AndroidC++JavaMobile  Game Engine Developer GamejamHCMNegotiable HTML5GameUnityC#  Expert Data Management Engineer DataStreams AsiaHNFrom 1,000 USD C++JavaDatabase  UI/UX Designer VNIB TECH Co LtdHCMNegotiable UX/UI DesignPhotoshopIllustratorAdobe XD  C++ Software Engineer Công ty TNHH Dịch Vụ T&YHCMUp to 4,500 USD C++ “Em thấy hai cách chả khác quái cả.” Xem tiếp Xem tiếp Nhìn qua việc dùng biến public biến private + [SerializeField] khơng khác Cả hai cách cho phép người project bạn chỉnh sửa trực tiếp giá trị biến Unity Inspector Nghĩa dù bạn làm này: public class Character : MonoBehaviour { [SerializeField] private int healthPoint; } Xem tiếp … hay này: public class Character : MonoBehaviour { public int healthPoint; // Đừng làm theo, khuyên thật } Xem tiếp … mở script Character sửa giá trị HP nhân vật đó, ví dụ từ lên 10 Sự khác biệt khơng rõ ràng lắm? Giờ nhìn theo hướng lập trình viên Tưởng tượng ngày thằng Dũng ngồi cạnh bạn dùng đám code cho tính mà xử lý Nếu bạn dùng biến public, thằng Dũng truy cập tới biến từ đâu chương trình, đoạn code hồn tồn hợp lệ: public class Foo: MonoBehaviour { void Update() { Character c; Debug.Log(c.healthPoint); } } Xem tiếp Nhưng bạn chọn cách dùng biến private, Dũng khơng thể dùng biến Sự khác biệt Hàng công cộng tức công chúng xài Sự khác biệt khơng đáng kể – Dũng dùng biến HP khơng, chấm hết Vậy lại phải làm to chuyện lên làm gì? Tại bạn cần giấu biến liệu bạn mà phô ra? Hãy xét trường hợp bạn dùng biến public Thằng Dũng cần lấy giá trị HP để làm máu nhân vật, ví dụ Ừ khơng phải to tát lắm, đọc thơi mà, chẳng ảnh hưởng tới bạn Nhưng đến Cường nhảy vào project phải lập trình vật phẩm giúp x2 máu nhân vật Vì biến HP bạn public, nên thằng Cường cần nhặt lên xài bình thường, tự nhiên ruồi Character c; c.healthPoint = c.healthPoint * 2; Xem tiếp Cách làm dẫn tới vấn đề đau đầu nhanh Với trường hợp đoạn code trên, chẳng có giá trị giới hạn cho máu nhân vật cả, tăng, tăng nữa, tăng Rõ ràng không ổn chút Bạn cần phải thêm giá trị vào class Character bạn để giới hạn giá trị lớn giá trị HP Lấy ví dụ, nhân vật có máu 80/100 nhặt vật phẩm Cường Nếu khơng có giới hạn trên, máu nhân vật 160/100 (wtf?) thay giá trị 100/100 public class Character : MonoBehaviour { public int healthPoint; // Bạn thêm giá trị max HP vào để giới hạn giá trị max HP public int maxHealthPoint; } Xem tiếp // Code Cường Character c; c.healthPoint = c.healthPoint * 2; if (c.healthPoint > c.maxHealthPoint) c.healthPoint = c.maxHealthPoint; Xem tiếp Để đạt điều này, Cường phải sửa phần code sau bạn thêm giá trị max HP vào code bạn – thật phiền Tại đơn giản việc tập trung vào vật phẩm hồi máu nó, cịn bạn xử lý chi tiết lặt vặt Dù bạn người chịu trách nhiệm cho class Character mà? Trường hợp Cường ví dụ cho việc sử dụng biến public làm cho code bạn mong manh dễ vỡ Các yêu cầu phát triển phần mềm, bao gồm game, không bất biến suốt q trình phát triển Thậm chí, yêu cầu thay đổi nhanh người yêu cũ trở mặt Mặc dù biến public truy cập dễ dàng từ nơi, đồng nghĩa với việc code bạn khó thích nghi với thay đổi từ yêu cầu Giờ thử thay đổi phương án tiếp cận, cách đổi sang sử dụng biến private Video Trọn kinh doanh Facebook 2019 Đẹp khoe xấu che 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; } } Xem tiếp Chúng ta có hai thay đổi với hai giá trị máu nhân vật Thứ nhất, hai giá trị biến private, tức đọc ghi phạm vi class Character bạn Nói cách khác, bạn người tồn quyết định hai giá trị xử lý Thứ hai, người mở script Character bạn Unity, họ thay đổi giá trị max HP Giá trị HP hồn tồn khơng thể bị chỉnh sửa tuỳ tiện Sự thay đổi hợp lý, sửa giá trị HP nhân vật Play mode, có lỗi logic xảy Vấn đề Dũng, người cần đọc giá trị máu nhân vật, giải hàm getter property giúp đọc giá trị biến healthPoint Nếu bạn đến từ background C++ bạn thấy hàm getter quen thuộc Thực công việc hàng ngày, thích cách sử dụng hàm getter property, mục đích rõ ràng Thêm thao tác tìm kiếm chỗ sử dụng hàm getter dễ nhiều so với property, bạn không cần phải lọc đoạn mà property dùng để sửa giá trị biến Đây hoàn toàn vấn đề sở thích cá nhân thơi, bạn xài cách khiến bạn cảm thấy thoải mái Với việc để biến class bạn private, Dũng Cường trực tiếp truy cập tới biến code chúng nó, chúng bị quăng vào mặt đống lỗi biên dịch Với điều tốt, ý đồ khơng nơi khác code base, ngoại trừ class Character, trực tiếp truy cập tới biến Nếu Dũng Cường muốn đọc ghi giá trị này, chúng phải xài hàm cung cấp chơi theo luật đề Ví dụ, Cường cần tập trung vào việc hồi máu vật phẩm với hàm Heal mà không cần phải lo đến việc máu nhân vật vượt ngưỡng max, xử lý đoạn Mình khơng cần phải bảo xử lý trường hợp đó, bớt việc phải làm Một người khoẻ, hai người vui Khi biến giới hạn phạm vi class, bạn kiểm sốt tồn việc liên quan đến biến theo dõi, maintain update Lấy ví dụ, bạn nhìn hàm Heal Damage trên, bạn thấy hồn tồn chưa xử lý trường hợp tham số đầu vào có giá trị âm Nếu Cường vơ tình (hoặc cố tình) truyền vào tham số âm, chắn có biến xảy ra, mà vật phẩm cho giúp hồi máu nhân vật thực tế lại làm cho nhân vật ngoắc đến mức muỗi đốt chết Vậy bug Bạn cần thêm đoạn code xử lý cho trường hợp tham số âm, đời lại phơi phới Cường Dũng chí cịn sửa code chúng Đặt lại vấn đề, bạn dùng biến public Dũng phải xử lý trường hợp máu nhân vật tụt xuống giá trị âm Cường thảm Nó phải xử lý thứ giá trị âm hay giá trị max Điều làm code trơng mớ rác Rồi ngày nhận phía game design u cầu làm thêm phần trang bị, có trang bị giúp tăng max HP nhân vật Và phải tìm đến chỗ để cập nhật thay đổi Sau rage quit, tìm đến bạn để phang bàn phím vào đầu bạn, phi khỏi cửa không quay lại Thế bạn phải tiếp quản phần việc Cường Bạn nhận thấy với tính thêm vào, bạn ổn bạn chuyển hết phần xử lý máu vào script khác, gọi Health Component Chuyển xong, bạn nhận 666 lỗi biên dịch, biến public dùng khắp nơi xung quanh project Kể bạn dọn lỗi biên dịch này, bạn cần phải miệt mài test test lại tính để đảm bảo chúng hoạt động trước bạn refactor Kết Phàm đời xảy có nguyên nhân Giấu liệu bạn vào phạm vi class (hay nói văn hoa theo chuẩn OOP đóng gói – encapsulation) không ngoại lệ Với tất bất lợi trình bày trên, tin việc sử dụng biến public để bạn thay đổi giá trị Unity Inspector khơng đáng [SerializeField] đảm nhiệm việc ngon lành, bạn tận dụng lợi tính đóng gói Mình thừa nhận viết dịng code đầu tiên, làm thứ public dễ dàng nhiều so với việc viết thêm đoạn accessor getter hay setter Nhưng nhớ rằng, phút lười nhác tốn bạn hàng làm bù tương lai Vậy nên đừng dùng biến public Nếu phải dùng, bạn tốt nên có nhiều lý thật tốt để sử dụng chúng ... Nhìn qua việc dùng biến public biến private + [SerializeField] khơng khác Cả hai cách cho phép người project bạn chỉnh sửa trực tiếp giá trị biến Unity Inspector Nghĩa dù bạn làm này: public class... cách dùng biến private, Dũng dùng biến Sự khác biệt Hàng công cộng tức công chúng xài Sự khác biệt khơng đáng kể – Dũng dùng biến HP khơng, chấm hết Vậy lại phải làm to chuyện lên làm gì? Tại. .. ngày thằng Dũng ngồi cạnh bạn dùng đám code cho tính mà xử lý Nếu bạn dùng biến public, thằng Dũng truy cập tới biến từ đâu chương trình, đoạn code hồn tồn hợp lệ: public class Foo: MonoBehaviour

Ngày đăng: 28/09/2020, 22:08

Từ khóa liên quan

Mục lục

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

    • Mục lục nội dung

    • Hàng công cộng tức là công chúng xài sao cũng được

    • Đẹp khoe xấu che

    • Kết

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan