Sử dụng getter hay lưu trữ giá trị tốt hơn

E muốn hỏi là trong trường hợp trên thì cách nào tốt hơn nếu cần giá trị đó để sử dụng nhiều lần. E ko biết là dùng get lấy giá trị từ class khác so sánh với tạo ra giá trị sẵn có như nhau ko?

E có làm game unity, trong unity có ScriptableObject để chứa các giá trị biến, có thể lưu giá trị thành 1 đối tượng và sử dụng trong các class khác mà ko phải khởi tạo giá trị biến, mà chỉ cần tham chiếu đến đối tượng ScriptableObject đó trong class đó rồi lấy giá trị của nó là dc, e nghĩ static class cũng tương tự nên lấy nó làm ví dụ để những ai ko làm game unity có thể hình dung
E muốn hỏi là liệu trong trường hợp đó e xài getter để lấy giá trị từ 1 đối tượng đã có sẵn trong heap như ScriptableObject hay static class (ScriptableObject chỉ dc tạo ra 1 đối tượng trong heap, nếu xài class thì khi tạo thành nhiều đối tượng có thể gây lãng phí bộ nhớ hơn ) hay tạo ra 1 biến khác rồi coppy giá trị đó lại rồi dùng (coppy lại => tạo biến trong class = tạo trong heap, so với ko coppy mà xài get => ko tạo ra thêm giá trị trong heap vì mình chỉ tham chiếu đến 1 đối tượng có sẵn như StaticClass => nhưng phải thông qua getter để lấy giá trị, nhưng e ko biết có ảnh hưởng gì đến hiệu suất ko? nếu mà mình phải sử dụng giá trị nhiều lần để thao tác) . Chốt lại là tạo thêm biến rồi gán giá trị, để lưu lại xài trực tiếp hay lấy gián tiếp qua getter tốt hơn ạ?

chắc cách nào cũng vậy, cách B có lẽ lẹ hơn tí xíu. Sao ko chạy game thử xem frame rate cái nào cao hơn thì xài :hocho: mà sao ko xài thẳng ScriptableObject.x luôn tạo class A B làm gì nữa???

1 Like

Vì nó ko khác biệt nhiều nên e nghĩ test kiểu vậy hơi khó. Thứ 2, lý do e ko xài thẳng là vì e muốn class khác tham chiếu đến class mà giữ tham chiếu của scriptable object nên e nghĩ 2 cách 1 là biến nó thành 1 biến 2 là biến thành field mà có getter trả class có tham chiếu scriptable object (dạng get => InstanceOfclass.scriptableobject.giaTriCanLay)

thực ra như a nói là nó cũng như nhau, xài cái nào cũng dc. Chỉ là e thắc mắc liệu xài trực tiếp đi đến địa chỉ ô nhớ trong heap, với chạy thêm 1 dòng lệnh vào dòng return của getter có khác biệt ko?

Còn 1 cái nữa e ko biết nó có khác biệt ko đấy là con trỏ, trỏ vào dạng class.value với class1.class2.value
có khác biệt về mặt hiệu suất ko? 1 cái là chỉ đến địa chỉ luôn, 1 cái là chỉ đến địa chỉ 1 rồi thêm 1 lần thao tác nữa đến địa chỉ 2. Liệu 2 cái này trong máy tính nó có tính toán vs thời gian và hiệu suất như nhau ko?

Làm như vậy, nếu mà 2 class có liên quan đến nhau mà tham chiếu đến nhau thì những biến đối tượng mà của 1 class mà muốn cho class còn lại xài thì có 2 cách 1 là tạo những biến đối tượng y hệt sau đó gán giá trị hoặc xài dạng get => InstanceOfClass.BienDoiTuong.BienCanLay

Nếu mà class1.value với class1.class2.value có khác biệt về thời gian thực thi thì có phải việc tạo thêm biến sau đó gán giá trị để có thể gọi trực tiếp tuy có thêm bộ nhớ heap dc gán giá trị nhưng sẽ nhanh hơn

cái ScriptableObject kia là static class nghĩa là global là có thể truy cập bằng bất kì object nào rồi, cần gì 1 object khác ref tới nó để truy cập thông qua ref này??

ví dụ ScriptableObject.gravity chẳng hạn, thì gravity đó truy cập thông qua ScriptableObject.gravity luôn chứ cần gì tạo objectOfClassA.gravity làm gì :hocho:

1 Like

à, e quên nói là nó chỉ giống static ở 1 chỗ là nó chỉ là 1 đối tượng dc tạo sẵn khi chương trình chạy thôi còn ko acess global dc, phải tham chiếu đến nó, rồi kéo từ editor vào, nó kiểu dạng file dữ liệu chứa data. Nó sinh ra là để VD có 10 viên đạn chung 1 data bao gồm damage, attackSpeed, activeTime. Nếu a tạo 10 viên thì sẽ có 30 biến dc tạo với 10 Object viên đạn nhưng scriptable object nó chỉ cần tạo 1 đối tượng thôi xong tham chiếu đến lấy value của biến là dc (nhưng value của 10 viên phải giống hệt nhau)

Nó cũng là 1 class thôi nhưng dc unity nó tạo ra 1 cách đặc biệt với những tính năng đặc biệt

Unity xài ECS, nếu vậy thì trong mỗi entity viên đạn có component Đạn là tham chiếu tới cái scriptable object kia à :hocho:

1 Like

Và 1 cái nữa ko biết nó có giống static ko đó là nó tham chiếu dựa kéo thả trên editor chứ ko phải tạo đối tượng = new, nên cũng xêm xêm là acess global dc nhưng ko thông qua code mà qua địa chỉ dc ng code tạo dựa theo file

uk, 10 viên sẽ chỉ cần 1 đối tượng, rất tiết kiệm bộ nhớ

vậy xài từ component đó luôn chứ còn tạo getter gì nữa :crazy_face: tạo thêm 1 bước nữa như vậy được thêm lợi ích gì :V :V

1 Like

Đúng rồi a, cách hay là tham chiếu tới nó và xài luôn mà chả cần thông qua class nào cả, e chỉ hỏi để hiểu hơn về mấy cái e thắc mắc thôi và nếu việc tham chiếu tầng tầng lớp lớp cũng như nhau vs ko, thì code sẽ bớt tham chiếu hơn (clean code)

làm cái game chơi được đã rồi tính tới marketing tính tới publish rồi cuối cùng hẵn lo tới clean code :hocho: :hocho: :hocho:

1 Like

thì e đang làm mà, nên thắc mắc hỏi, đặt câu hỏi để giúp mình tốt hơn :smile:

game cần nhiều tính năng hơn là clean code, 1 game mì ăn liền chắc tầm 5 năm là hết người chơi cần gì clean code để vận hành 20 năm :hocho: :hocho:

1 Like

game e làm nó hơi lớn xíu nên ko clean code là nó rối mù lên, tr làm mấy con nhỏ nhỏ luyện tập thì tham chiếu linh tinh miễn sao ra kết quả là dc nhưng chương trình lớn giảm tham chiếu đỡ rối

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