Khái niệm cơ bản và nguyên lý lập trình
-
Khái niệm cơ bản:
- 4 đặc điểm của lập trình hướng vật thể
- Biến là dữ liệu, hàm là thuật toán. Biến là danh từ, hàm là động từ
- Biểu thức (expression) là những thứ trả lại một giá trị nào đó
- Hoạt động trung tâm của lập trình hướng vật thể là phân loại
- Callback là những hàm được dùng như đối số của hàm khác và đã xác định sẵn đối số truyền vào cho nó rồi
- f(a)(b) để gọi hàm f(a) có chứa hàm con f1(b)
- Giao diện là cái khuôn của phương thức
- Hàm cũng là vật thể
- Hàm vô danh, hàm mũi tên, lambda là những cái tên khác nhau cho cùng một thứ
- Việc tách một khối code thành một hàm khiến cho việc đọc từng dòng trở thành đọc từng bước
- Ý tưởng của lập trình hướng vật thể là gom nhiều hàm và dữ liệu vào trong một đơn vị gọi là vật thể
- Để tránh phụ thuộc lòng vòng (circular dependency) có thể dùng hàm
- Map, dictionary, associative array, hash, hash table là những cái tên cho cùng một thứ
- API là giao diện của một chương trình
- Giao diện là cách để sử dụng vật thể mà không cần biết bên trong nó có gì
- Khi import một hàm thì cả file chứa hàm đó sẽ được chạy. Các import của file đó cũng sẽ chạy theo, dù là để import vào một hàm khác mình không import
- Nên tách bạch code hỗ trợ cho client và server vào những mô đun khác nhau
- Package và library là những cái tên khác nhau cho cùng một thứ
- Việc dùng export chính là đang tạo API. API là các vật thể được export
- Nên để dư một dấu phẩy ở phần tử cuối cùng khi tạo vật thể hoặc mảng
- Việc hiển thị nội dung dữ liệu như thế nào là do công cụ quyết định, không phải ngôn ngữ quyết định
- Dùng lớp khi ta có logic nghiệp vụ thực sự cần được thực thi. Dùng giao diện để tạo ràng buộc kiểu cho biến
- Không cần biết vật thể chứa dữ liệu gì, chỉ cần quan tâm nó làm được gì
- Lớp là một cái khuôn để tạo các vật thể cho nhanh
- Những vật thể đơn giản dùng để tra cứu dữ liệu theo từ khoá gọi là từ điển
- Mảng giống vật thể nhưng tất cả các thuộc tính đều là số. Từ điển giống vật thể nhưng tất cả các thuộc tính đều là chuỗi
- Từ điển là vật thể được dùng để tra cứu dữ liệu theo từ khoá chứ không phải là để thao tác và thay đổi thuộc tính bằng phương thức
- Các vật thể tương tác với nhau qua phương thức và không trực tiếp làm thay đổi giá trị của nhau
- Phương thức cho ta biết mình có thể làm gì với vật thể
- Phương thức là một thuộc tính của vật thể
- Phương thức phải gắn lên một vật thể cụ thể nào đó để có tác dụng
- this, self là cách để nói rằng hành động mà phương thức sẽ làm sẽ phải gắn lên một vật thể cụ thể của lớp, thứ mà bây giờ chưa được tạo ra
- Thay vì ta thao túng trực tiếp dữ liệu, ta điều khiển vật thể qua phần giao tiếp của nó với bên ngoài
- Thuộc tính nguyên thủy là những thuộc tính có sẵn mình không cần tạo
- Việc đóng gói (encapsulation) giúp ta không cần quan tâm vật thể lưu dữ liệu thế nào, mà chỉ cần quan tâm tới thuộc tính và phương thức của nó
- Vật thể là dạng dữ liệu có những thuộc tính thành phần
- Vật thể ngoài tự nhiên không chứa hướng dẫn để sử dụng nó. Vật thể trong máy tính có hướng dẫn sử dụng nó
-
Kiểu và việc thực thi:
- Compile time là lúc chuyển từ ngôn ngữ lập trình mà người hiểu sang ngôn ngữ máy chỉ có máy mới hiểu. Runtime là lúc máy chạy mã máy
- Các compiler được tạo ra từ các compiler
- Kiểu động là kiểu được kiểm tra vào lúc chạy. Kiểu tĩnh là kiểu được kiểm tra lúc biên dịch (trước lúc chạy)
- Kiểu động làm cho việc học lập trình dễ hơn. Kiểu yếu giúp ngôn ngữ được tự do ép kiểu để đoán ý người dùng dễ hơn
- Lỗi runtime là lỗi logic, khi chạy mới thấy. Lỗi compile time là lỗi cú pháp, khi biên dịch là thấy ngay
- Code giống như các nốt nhạc, động cơ giống như nhạc công, còn môi trường thực thi giống như nhạc cụ
- Runtime là lúc chạy, runtime environment là môi trường thực thi. Nhưng nhiều lúc runtime environment được gọi tắt là runtime
- Ngôn ngữ và động cơ thường trùng tên
- Sự xuất hiện của language server giúp ta có thể bắt kiểu trước cả lúc biên dịch cho những ngôn ngữ chỉ bắt kiểu lúc chạy
- Thường mọi người dùng compile time đồng nghĩa với devtime
- Thời điểm xét kiểu quyết định độ động tĩnh của nó. Cách kiểu được xét quyết định độ mạnh yếu của nó
-
Nguyên lý:
- Bộ nguyên lý SOLID giúp phần mềm dễ bảo trì, dễ mở rộng
- Cái trừu tượng không nên phụ thuộc vào những cái cụ thể mà những cái cụ thể nên phụ thuộc vào cái trừu tượng
- Dạng vật thể thường là tiện cho người, dạng mảng thường là tiện cho máy
- Mảng các vật thể và mảng các mảng
- Mặc dù mảng lưu giữ thứ tự, nhưng nhiều khi ta không quan tâm đến thứ tự đó cho lắm
- Việc biến đổi dữ liệu chủ yếu là để người dùng đọc cho tiện, và để máy kiểm tra dữ liệu
- API ổn định khác với API sẵn sàng cho việc tạo sản phẩm
- Giao diện lập trình (programing interface) khác với giao diện người dùng (user interface)
- Giao diện nhấn mạnh vào mô hình dữ liệu, còn giao thức nhấn mạnh vào các quy tắc và thủ tục trong quá trình truyền và trao đổi dữ liệu
- Mẫu thiết kế (design pattern) là những giải pháp cho những vấn đề thường gặp trong lập trình mà nhiều thế hệ lập trình viên đã đúc kết và chứng minh tính hiệu quả của nó
- Nguyên lý
- Người mới lập trình thường hỏi nên dùng cú pháp, thư viện, hay ngôn ngữ nào. Lập trình viên nhiều kinh nghiệm thường tập trung vào các khái niệm trừu tượng
- Quy trình viết tài liệu
- Singleton hay được dùng trong các trình quản lý plugin
- Giao diện người dùng, logic, dữ liệu là 3 thành phần cơ bản cho một chương trình. Chúng có mục tiêu khác nhau, kỹ thuật xử lý khác nhau. Không thể trộn lẫn lộn với nhau được.
- Model không biết đến View, View không biết đến Controller
- while familiarity is a perfectly fine reason, it is really a bad sign if it is the only reason
- Cyclomatic complexity đánh giá độ phức tạp khi viết kiểm thử. Cognitive complexity đánh giá độ phức tạp trong việc đọc
- Các lý do làm tăng cyclomatic complexity
- Có những đoạn code có cùng cyclomatic complexity nhưng lại khác cognitive complexity
- Mỗi đường cơ sở trong biểu đồ dòng tương ứng với một testcase
- Thay vì dùng số nút và cạnh để tính độ phức tạp chu trình, hãy đếm số miền bị chia ra
- Mỗi lớp, hàm, mô đun chỉ đảm nhiệm một nhiệm vụ xác định
- Sự couple dễ được sinh ra khi muốn xử lý các dữ liệu giống nhau về chức năng và na ná nhau về cấu trúc và cách xử lý
- Tránh dùng hàm lồng để làm giảm sự couple
- Việc chia các lệnh trong kịch bản thành các hàm nhỏ hơn sẽ giúp dễ bắt lỗi hơn
- Đường cú pháp là những loại cú pháp giúp việc đọc dễ dàng hơn. Muối cú pháp là những loại cú pháp giúp việc viết sai trở nên khó khăn hơn
- Block comment dành cho việc giải thích ý tưởng của code, viết doc. Line comment để debug hoặc hướng dẫn editor đọc code của mình (directive)
- Bản thân việc lập trình bằng ngôn ngữ bậc cao đã là một dạng comment
- Comment có thể cho thông tin sai, nhưng code thì không
- Comment cũng có bug, nhưng không giống như code, không có chương trình nào hỗ trợ debug được nó
- Hãy viết code sao cho mình khỏi comment
- Nên dùng comment để giải thích về thuật toán, các đánh đổi trong việc ra quyết định hoặc dẫn nguồn
- Quy ước đặt tên biến
- Thay vì comment, hãy document. Thay vì giải thích cách code hoạt động, hãy hướng dẫn cách sử dụng nó
- Việc đặt tên không có tiền tố gì sẽ tiện khi nó thường được dùng thường xuyên ở những nơi khác, ở trong một danh sách, hoặc khi dùng để liệt kê các thuộc tính
- Đặt tên biến, viết comment