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,…)