Đôi lời về lập trình hướng đối tượng (OOP) ? Từ một người trẻ đang trên con đường làm game

@khanhsieunhan b hoc cơ điên tư mà làm game a , không đinh theo ngành học sau này sao ? tương lai b đih làm j ?

Mình học cơ điện tử là hồi cấp 3 muốn học 1 ngành kỹ thuật cơ mà không phải cơ khí hay CNTT hay điện thôi :slight_smile: Thấy cơ điện tử hay hay nên học, chứ sở thích, cũng là khả năng và sở trường của mình là lập trình và sáng tạo kịch bản (hồi cáp 3 còn viết tiểu thuyết rồi cơ :smile: )
Hiện tại thì mình đang cố học cho lấy cái bằng cho đỡ tốn tiền tốn công học, còn tương lai thì mình sẽ chuyên tâm làm game thôi. Mình đang tự học Unity, vì thấy nó gọn nhẹ, phù hợp sử dụng cho các dự án nhỏ như mình.
Mong ước là có studio riêng, có nhà đầu tư, dùng hẳn tới Unreal Engine làm game AAA :smile:

2 Likes

@khanhsieunhan nhưg b chuyên ngah cơ điên tư , sau xin vào các cty CNTT găp khó khăn đây , vi ho ưu tuyên ngươi hc đug chuyên ngah hơn

ừm hiện tại mình đang hướng làm game độc lập hơn là theo vào 1 công ty nào đấy, vì theo vào công ty thì mình chỉ có làm theo ý tưởng của họ thôi, và tiền kiếm ra cũng không nhiều, ngoài ra thì mình không chuyên về lập trình mà chỉ học đủ để làm game thôi. ý tưởng thì mình có rồi, mình hiện tại cũng không định làm game lớn mà chỉ tập trung vào những game nhỏ có gameplay hay trước. mục tiêu của mình cũng là kiếm tiền thôi, không còn gì khác. thế nên mình nghĩ là mình sẽ làm nhà phát triển độc lập hơn chứ không học rồi đi làm theo 1 công ty nào đấy.
nhưng về sau khi phát điển được đến có 1 studio thì mình cũng mong studio của mình được công ty nào đó bảo trợ, như vậy sẽ chắc chắn hơn về mặt kinh tế.

sức mạnh của OOP chính là phân tích vấn đề từ dưới lên và 1 chương trình viết theo OOP thì nó rất dễ để mở rộng cũng như bảo trì , và mỗi phương pháp lập trình đều có điểm mạnh và yếu riêng của nó . OOP nó dùng kỹ thuật trừu tượng hóa dữ liệu để mô tả các đối tượng từ thế giới thực để đưa vào lập trình vì vậy có thể nói nó là 1 phương pháp LT sát với thực tế nhất . Mà bạn hình như cũng chưa học sâu về OOP thì phải vì OOP nó giải quyết bài toán theo hướng từ dưới lên nên khác với lập trình thủ tục từ trên xuống .Với lập trình thủ tục có thể bạn sẽ giải quyết vấn đề bằng cách chia nhỏ nó ra sau đó sẽ giải quyết từng vấn đề nhỏ , nên sau này nếu có thay đổi trong bài toán thì việc sửa hay mở rộng rất khó khăn , ngược lại OOP phân tích vấn đề từ những chi tiết nhỏ nhất sau đó sẽ dần mở rộng nó ra nên việc thay đổi và mở rộng lại rất dễ dàng . Bản chất của OOP không phải là đi giải quyết từng vấn đề như thủ tuc bạn nên hiểu đươc cái này…

Ngoài ra còn có LT logic , LT hàm mỗi loại LT đều có mục đích riêng của nó nên hiểu rõ bản chất của nó để áp dụng đúng nơi đúng lúc…

3 Likes

Bản thân mình thì mình thích Hướng đối tượng OOP hơn …Vì dễ trình bày,dễ quản lí,dễ sửa …

1 Like

làm game đọc lập chắc chịu nhiều áp lực về tài chính lắm anh nhỉ

cảm ơn bạn, đọc cmt của bạn ra mình hiểu ra rất nhiều. đúng là mình vẫn đang tự ngẫm nghĩ về điểm khác biệt mấu chốt của OOP và hướng thủ tục thuần túy. Mình có thể đúc lại như sau:
Vd có một bài toán là xử lý một dãy số, đầu tiên là các phần tử lên với 2, sau đó là cộng với 3.

  • Nếu đi theo hướng lập trình thủ tục, thì đầu tiên mình sẽ viết đoạn code giúp trả về dãy số đã nhân lên với 2, sau đó viết tiếp đoạn code giúp trả về dãy số đó cộng thêm với 3. Ở đây nếu bỗng dưng thay đổi đề bài ra, đó là cộng lên với 3 trước, rồi mới đến nhân lên với 2, thì ta phải xóa code đi và viết lại, vì đoạn code vừa viết không phục vụ đúng công việc đề ra nữa.
  • Nếu đi theo hướng đối tượng, mình sẽ xây dựng sẵn 2 “công cụ”, ở đây là xây dựng 2 hàm. Hàm thứ nhất là hàm trả về dãy số đã được nhân lên với 2, hàm thứ 2 là hàm trả về dãy số đã được cộng lên với 3. Như vậy, mình có thể dùng 2 hàm này trong nhiều trường hợp, tùy yêu cầu bài ra. VD như trên, khi thay đổi bài toán, mình chỉ cần gọi hàm thứ 2 trước hàm thứ nhất là xong, rất đơn giản.
  • Còn nếu đi theo hướng lập trình hàm, mình thì chưa hiểu rõ về lập trình hàm nhưng mình hiểu tư tưởng của nó, có nghĩa là chỉ quan tâm tới input và sử dụng input thế nào để ra được output, còn việc tính toán và xử lý thế nào thì việc đó của máy tính lo, mình không phải lo. thế nên mình nghĩ nếu theo hướng lập trinh hàm thì mình vẫn gọi 2 hai hàm như trên, chỉ có điều 2 hàm này được xây dựng sẵn. Ở OOP như trên thì tự bản thân mình phải xây dựng 2 hàm đó.

Đó là suy nghĩ của mình trong 2 tiết học ở trường từ khi đọc được cmt của bạn, giờ về nhà mới kịp reply. Mong bạn cho ý kiến.

2 Likes

Mình cũng đang thử so sánh giữa OOP và lập trình hàm, thấy 2 cái này nó khá gần nhau. Vì cùng xây dựng các hàm sẵn làm công cụ cho mình.

1 Like

Đúng là nếu mình tự làm thì rất áp lực về tài chính do không có nguồn thu. Lập trình viên Instagram cũng đi làm thêm ban ngày còn tối về tự học lập trình đó, như thế mới có tiền trang trải.
Cơ mà mình vẫn đang đi học nên may mắn là không bị lo lắng về khoản này.

1 Like

Hướng thủ tục hay OOP đều có thể phân tích theo top-down hoặc bottom-up, không phải là OOP chỉ có thể làm bottom-up. Bạn hoàn toàn có thể đi từ business requirement -> use-case diagram -> class + sequence diagrams -> detail design -> implementation để viết ra 1 app thuần OOP.

Trong lập trình hướng thủ tục nói chung, hay OOP nói riêng (OOP là nhánh con của thủ tục) có khái niệm abstraction và module. App bao gồm nhiều module, các module có các chức năng độc lập với nhau và chỉ giao tiếp với nhau thông qua interface của nó. Abstraction là cách để giấu đi phần hiện thực của mỗi module mà chỉ cho module khác biết thông qua interface của nó. Trong module sẽ khai báo rõ phần nào thuộc interface, phần nào không thuộc interface. Các thành phần của module thường là variable, function, constant, class, object.


Ví dụ trong TypeScript:
module Log {
export class NormalLog {
function log(message) { console.log(message); }
} // interface - class
export function RegexLog(message) {
console.log(privateRegex + " " + message);
} // interface - function

var privateRegex = "[A-Z]+"; // variable - not interface.
 }

Lập trình thủ tục rất linh động trong cách tạo interface. Bạn có thể tạo interface chỉ toàn là function như C hay áp dụng. Vì tính linh động đó quá mức khiến cho người viết app khó biết interface của module đó gồm những gì, có quy tắc nào để thống nhất nó không? Vì vậy người ta mới đề xuất OOP, giới hạn lại tính linh động của module.

OOP quản lý module bằng cách tập trung vào variable, constant và các hàm thao tác trên variable và constant đó. Và nó sẽ gom lại tạo thành 1 class, trong đó function được gọi khác là method.
Các từ khoá truy cập như public, protected, private sẽ xác định phạm vi interface của class. Inheritance thực chất là re-export. Bạn import từ 1 module (class), sau đó sửa đổi, và lại export module đó (class).

Với 1 chương trình OOP, hoàn toàn có cách để compile xuống thành chương trình thủ tục dễ dàng. Java là 1 ví dụ, Java là ngôn ngữ OOP, nhưng mã dịch bytecode của nó là hướng thủ tục, hàm của nó sẽ có dạng ClassName_functionName_paramType1_paramType2_…(objectName, param1, param2,…)

3 Likes

Chỗ này em thấy rất hay và đúng nữa (Y)

1 Like

liệu có hay ko khi làm một game 3d khủng chơi mấy tiếng mà chỉ có một người (em) làm hết tất cả công đoạn : coding và đồ hoạ :cold_sweat: ?

p/s : codeblocks làm game được không ?

Bạn hoàn toàn làm được bằng Codeblock nhé. Codeblock làm được game cơ mà làm theo theo kiểu cực kỳ thủ công, dùng SDL thì phải, ngày trước mình cũng học làm kiểu này nhưng khó lắm, bạn phải tự tay tính toán tất cả các hiệu ứng vật lý các kiểu,… nên mình không ủng hộ. Bình thường thì các hãng game lớn họ có nhân sự chất lượng, họ tự xây dựng game của mình thì họ mới đi theo hướng này thôi (thứ nhất là không mất tiền mua engine, thứ 2 là mình tự chủ được trong việc thiết kế các thành phần của game).
Ở link dưới đây là game do 1 mình 1 người việt nam sản xuất và làm ra, cơ mà anh ấy có kinh nghiệm học ở nước ngoài về thiết kế 3d rồi, nên khi làm thì anh ấy chỉ học thêm code thôi. Mình tự học code thì được, cơ mà tự học đồ họa thì chắc là cực kỳ khó khăn đấy. Thế nên nếu bạn không tự làm đồ họa, animation,… được thì bạn tự hiểu là bạn làm quái gì ra 1 game khủng được ?!
Mình thì cũng không tự làm đồ họa được, và ngoài ra thì phần đồ họa đối với mình không phải yếu tố chính nên mình cũng không lo lắm, chắc là mua package đồ họa sẵn vậy, mình tập trung vào gameplay thôi. Sau này có xiền thuê được ông đồ họa về làm cho thì tốt.

3 Likes

Mình thấy cơ điện tử đá qua lập trình cũng nhiều mà nhỉ , trường mình có ông ra đang làm android , thấy đi làn trc khi ra trường cơ , còn nhiều thì đa số đá qua lập trình nhúng , có ông thì lập trình đc vài năm rồi qua web luôn . Chứng tỏ họ vẫn làm đc việc và có chỗ làm đấy chứ nhỉ , mình ở ngoài HN còn ko biết trong nam thế nào

@Killua b cug hoc cơđt nhỉ , sau cug đinh theo lâp trình nhúng chứ? Ngoài bắc những nơi nào tuyển nhúng vây b? Co thể kể tên giúp mình k0?

“Linh” ??? :sweat_smile:

Trừu tượng (Abstraction) phải bắt nguồn từ cụ thể (concrete) cho đến khi nó thực sự đáng đặt một cái Tên (interface) cho nó. Đây là điểm chết người của OOP.
Dù sao đã có sẵn các nguyên lý SOLID và khuôn mẫu thiết kế (Design Patterns) nên nếu bạn tuân thủ chặt chẽ thì vẫn tốt.

1 Like

Nói ngắn gọn lập trình OOP thì giao tiếp với nhau bằng đối tượng :smiley: , mỗi đối tượng đảm nhận 1 vai trò cho nên cứ thế mà làm.

anh làm game độc lập , vậy là anh tự code và design luôn hả a ?

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