Trừu tượng & Thành phần

Khối khói nghệ thuật để hút thuốc - MattysFlicks - (CC BY 2.0)
Lưu ý: Đây là một phần của sê-ri Phần mềm soạn thảo phần mềm (bây giờ là một cuốn sách!) Về học lập trình chức năng và các kỹ thuật phần mềm tổng hợp trong JavaScript ES6 + từ đầu. Hãy theo dõi. Có rất nhiều điều này sẽ đến!

Càng trưởng thành trong phát triển phần mềm, tôi càng coi trọng các nguyên tắc cơ bản - những hiểu biết có vẻ tầm thường khi tôi mới bắt đầu, nhưng bây giờ có ý nghĩa sâu sắc với lợi ích của kinh nghiệm.

Trong môn võ thuật Karate [Cành], biểu tượng của niềm tự hào về đai đen là đeo nó đủ lâu để thuốc nhuộm nhạt dần thành màu trắng để tượng trưng cho việc trở về trạng thái mới bắt đầu. : Thiết kế, Công nghệ, Kinh doanh, Life Đời

Trừu tượng hóa là quá trình xem xét một cái gì đó độc lập với các liên kết, thuộc tính hoặc các phụ kiện cụ thể của nó, theo từ điển của Google.

Từ trừu tượng xuất phát từ động từ tiếng Latinh abstrahere, có nghĩa là cuốn sách để rút đi. Tôi thích cái nhìn sâu sắc này. Trừu tượng là về loại bỏ mọi thứ - nhưng chúng ta đang loại bỏ những gì, và kết thúc là gì?

Đôi khi tôi thích dịch các từ sang các ngôn ngữ khác và sau đó dịch chúng sang tiếng Anh để hiểu về các hiệp hội khác mà chúng tôi thường nghĩ về tiếng Anh. Khi tôi dịch bản dịch trừu tượng thành tiếng Yiddish và ngược lại, kết quả là đã vắng mặt. Tôi cũng thích nó. Một người đãng trí đang chạy trên chế độ lái tự động, không chủ động suy nghĩ về những gì họ làm khi họ làm điều đó.

Trừu tượng cho phép chúng tôi chạy tự động, an toàn. Tất cả phần mềm là tự động hóa. Cho đủ thời gian, bất cứ điều gì bạn làm trên máy tính, bạn có thể làm với giấy, mực và chim bồ câu. Phần mềm chỉ quan tâm đến tất cả các chi tiết nhỏ sẽ quá tốn thời gian để làm thủ công.

Tất cả các phần mềm là trừu tượng, ẩn đi tất cả các công việc khó khăn và các chi tiết không suy nghĩ trong khi chúng ta gặt hái những lợi ích.

Rất nhiều quy trình phần mềm được lặp đi lặp lại nhiều lần. Nếu, trong giai đoạn phân tách vấn đề, chúng tôi quyết định thực hiện lại nhiều lần các công cụ lặp đi lặp lại, điều đó sẽ đòi hỏi rất nhiều công việc không cần thiết. Nó sẽ là ngớ ngẩn ít nhất. Trong nhiều trường hợp, nó sẽ không thực tế.

Thay vào đó, chúng tôi loại bỏ trùng lặp bằng cách viết một thành phần của một loại nào đó (một hàm, mô-đun, lớp, v.v.), đặt cho nó một tên (danh tính) và sử dụng lại bao nhiêu lần tùy thích.

Quá trình phân hủy là quá trình trừu tượng hóa. Trừu tượng thành công ngụ ý rằng kết quả là một tập hợp các thành phần độc lập hữu ích và có thể tái chế. Từ đó, chúng ta có được một nguyên tắc quan trọng của kiến ​​trúc phần mềm:

Các giải pháp phần mềm nên có thể phân tách thành các bộ phận cấu thành của chúng và có thể phân tích lại thành các giải pháp mới mà không thay đổi các chi tiết triển khai thành phần bên trong.

Trừu tượng là hành động đơn giản hóa

Đơn giản là về việc trừ đi sự rõ ràng và thêm ý nghĩa. Hãy ~ John Maeda, về định luật của sự đơn giản: Thiết kế, công nghệ, kinh doanh, cuộc sống

Quá trình trừu tượng có hai thành phần chính:

  • Khái quát hóa là quá trình tìm kiếm sự tương đồng (rõ ràng) trong các mẫu lặp đi lặp lại và ẩn giấu những điểm tương đồng đằng sau một sự trừu tượng.
  • Chuyên môn hóa là quá trình sử dụng sự trừu tượng hóa, chỉ cung cấp những gì khác biệt (có ý nghĩa) cho từng trường hợp sử dụng.

Trừu tượng là quá trình trích xuất bản chất cơ bản của một khái niệm. Bằng cách khám phá điểm chung giữa các vấn đề khác nhau từ các miền khác nhau, chúng tôi tìm hiểu cách bước ra ngoài không gian của mình trong giây lát và xem vấn đề từ một góc nhìn khác. Khi chúng ta thấy bản chất của một vấn đề, chúng ta thấy rằng một giải pháp tốt có thể áp dụng cho nhiều vấn đề khác. Nếu chúng ta viết mã cho giải pháp tốt, chúng ta có thể giảm triệt để sự phức tạp của ứng dụng.

Nếu bạn chạm vào một thứ với nhận thức sâu sắc, bạn chạm vào tất cả mọi thứ.

Nguyên tắc này có thể được sử dụng để giảm triệt để mã cần thiết để xây dựng một ứng dụng.

Trừu tượng trong phần mềm

Trừu tượng hóa trong phần mềm có nhiều dạng:

  • Thuật toán
  • Cấu trúc dữ liệu
  • Mô-đun
  • Các lớp học
  • Khung

Và sở thích cá nhân của tôi:

Đôi khi, việc thực hiện thanh lịch chỉ là một chức năng. Không phải là một phương pháp. Không phải là một lớp học. Không phải là một khung. Chỉ là một chức năng. Trực tiếp ~ John Carmack (Phần mềm Id, Oculus VR)

Các hàm tạo ra sự trừu tượng tuyệt vời vì chúng có những phẩm chất cần thiết cho sự trừu tượng hóa tốt:

  • Danh tính - Khả năng gán tên cho nó và tái sử dụng nó trong các ngữ cảnh khác nhau.
  • Thành phần - Khả năng soạn các hàm đơn giản để tạo thành các hàm phức tạp hơn.

Trừu tượng thông qua thành phần

Các hàm hữu ích nhất cho sự trừu tượng hóa trong phần mềm là các hàm thuần túy, chia sẻ các đặc điểm mô đun với các hàm từ toán học. Trong toán học, một hàm được cung cấp cùng một đầu vào sẽ luôn trả về cùng một đầu ra. Nó có thể xem các chức năng như quan hệ giữa đầu vào và đầu ra. Cho một số đầu vào A, một hàm f sẽ tạo ra B là đầu ra. Bạn có thể nói rằng f xác định mối quan hệ giữa A và B:

f: A -> B

Tương tự như vậy, chúng ta có thể định nghĩa một hàm khác, g, xác định mối quan hệ giữa B và C:

g: B -> C

Điều này ngụ ý một chức năng h khác xác định mối quan hệ trực tiếp từ A đến C:

h: A -> C

Các mối quan hệ này tạo thành cấu trúc của không gian vấn đề và cách bạn soạn các hàm trong ứng dụng của bạn tạo thành cấu trúc của ứng dụng của bạn.

Trừu tượng tốt đơn giản hóa bằng cách ẩn cấu trúc, cùng một cách h làm giảm A -> B -> C xuống A -> C.

Cách làm nhiều hơn với ít mã hơn

Trừu tượng là chìa khóa để làm nhiều hơn với ít mã hơn. Ví dụ, hãy tưởng tượng bạn có một hàm chỉ cần thêm hai số:

const thêm = (a, b) => a + b;

Nhưng bạn sử dụng nó thường xuyên để tăng, có thể có ý nghĩa để sửa một trong những số đó:

const a = thêm (1, 1);
const b = thêm (a, 1);
const c = thêm (b, 1);
// ...

Chúng ta có thể cà ri chức năng thêm:

const thêm = a => b => a + b;

Và sau đó tạo một ứng dụng một phần, áp dụng hàm cho đối số đầu tiên của nó và trả về một hàm mới có đối số tiếp theo:

const inc = thêm (1);

Bây giờ chúng ta có thể sử dụng inc thay vì thêm khi chúng ta cần tăng thêm 1, điều này làm giảm mã yêu cầu:

const a = inc (1);
const b = inc (a);
const c = inc (b);
// ...

Trong trường hợp này, inc chỉ là một phiên bản chuyên biệt của add. Tất cả các chức năng curried là trừu tượng. Trong thực tế, tất cả các hàm bậc cao hơn là các khái quát mà bạn có thể chuyên môn hóa bằng cách chuyển một hoặc nhiều đối số.

Ví dụ, Array.prototype.map () là một hàm bậc cao hơn, trừu tượng hóa ý tưởng áp dụng một hàm cho mỗi phần tử của một mảng để trả về một mảng mới của các giá trị được xử lý. Chúng ta có thể viết bản đồ như là một hàm được uốn cong để làm cho điều này rõ ràng hơn:

const map = f => Array => Array.map (f);

Phiên bản bản đồ này có chức năng chuyên biệt và sau đó trả về một phiên bản chuyên biệt của chính nó lấy mảng được xử lý:

const f = n => n * 2;
const double ALL = map (f);
const nhân đôi = double ALL ([1, 2, 3]);
// => [2, 4, 6]

Lưu ý rằng định nghĩa của double ALL yêu cầu một lượng mã không đáng kể: map (f) - vậy thôi! Đó là toàn bộ định nghĩa. Bắt đầu với các khái niệm trừu tượng hữu ích như các khối xây dựng của chúng tôi, chúng tôi có thể xây dựng hành vi khá phức tạp với rất ít mã mới.

Phần kết luận

Các nhà phát triển phần mềm dành toàn bộ sự nghiệp của họ để tạo và soạn thảo các bản tóm tắt - nhiều bản không có sự nắm bắt cơ bản tốt về trừu tượng hoặc thành phần.

Khi bạn tạo trừu tượng, bạn nên cân nhắc về nó và bạn nên biết về những trừu tượng tốt đã có sẵn cho bạn (chẳng hạn như bản đồ, bộ lọc và giảm thiểu luôn hữu ích). Tìm hiểu để nhận ra các đặc điểm của trừu tượng tốt:

  • Đơn giản
  • Ngắn gọn
  • Tái sử dụng
  • Độc lập
  • Có thể phân hủy
  • Tái chế

Tìm hiểu thêm tại EricElliottJS.com

Các bài học video về lập trình chức năng có sẵn cho các thành viên của EricElliottJS.com. Nếu bạn không phải là thành viên, hãy đăng ký ngay hôm nay.

Eric Elliott là tác giả của chương trình JavaScript lập trình ứng dụng JavaScript (O hèReilly) và đồng sáng lập của nền tảng cố vấn phần mềm, DevAnywhere.io. Ông đã đóng góp vào trải nghiệm phần mềm cho Adobe Systems, Zumba Fitness, Tạp chí Phố Wall, ESPN, BBC và các nghệ sĩ thu âm hàng đầu bao gồm Usher, Frank Ocean, Metallica, và nhiều hơn nữa.

Anh làm việc từ xa từ bất cứ đâu với người phụ nữ đẹp nhất thế giới.