Khung phần mềm là gì? [đóng cửa]


193

Ai đó có thể vui lòng giải thích cho tôi một khung phần mềm là gì? Tại sao chúng ta cần một khuôn khổ? Một khung làm gì để làm cho lập trình dễ dàng hơn?

Câu trả lời:


422

Tôi rất muộn để trả lời nó. Nhưng, tôi muốn chia sẻ một ví dụ, mà tôi chỉ nghĩ đến ngày hôm nay. Nếu tôi bảo bạn cắt một mảnh giấy có kích thước 5m x 5m, thì chắc chắn bạn sẽ làm được điều đó. Nhưng giả sử tôi yêu cầu bạn cắt 1000 mảnh giấy có cùng kích thước. Trong trường hợp này, bạn sẽ không thực hiện phép đo 1000 lần; rõ ràng, bạn sẽ tạo ra một khung hình 5m x 5m, và sau đó với sự trợ giúp của nó, bạn sẽ có thể cắt 1000 mảnh giấy trong thời gian ngắn hơn. Vì vậy, những gì bạn đã làm là tạo ra một khung công tác sẽ thực hiện một loại nhiệm vụ cụ thể. Thay vì thực hiện cùng một loại nhiệm vụ lặp đi lặp lại cho cùng một loại ứng dụng, bạn tạo một khung có tất cả các tiện ích đó trong một gói đẹp, từ đó cung cấp sự trừu tượng cho ứng dụng của bạn và quan trọng hơn là nhiều ứng dụng.


27
Tôi muốn biết lý do để bỏ phiếu trả lời. Nó sẽ giúp tôi cải thiện nó.
Neha Choudhary

4
tuyệt vời rất dễ hiểu ........... cảm ơn rất nhiều
Premkumar

25
@NehaChoudhary, Không phải tôi, nhưng anh ấy -1 vì những gì bạn đang nói là một thư viện, không phải là một khung vì không có IoC.
Pacerier

11
Tôi đã đọc bài viết của bạn, nhưng những gì bạn đăng có vẻ giống như những gì một thư viện có thể làm. Làm thế nào về việc giải thích sự khác biệt giữa khung và thư viện?
Aaron Liu

2
Tôi không hiểu Từ những gì bạn giải thích sẽ giống như một thư viện phải không?
bộ định tuyến

92

Về mặt kỹ thuật, bạn không cần một khuôn khổ. Nếu bạn đang tạo một trang web thực sự đơn giản (nghĩ về web vào năm 1992), bạn có thể làm tất cả với HTML được mã hóa cứng và một số CSS.

Và nếu bạn muốn tạo một ứng dụng web hiện đại, bạn thực sự không cần phải sử dụng một khuôn khổ cho điều đó.

Thay vào đó, bạn có thể chọn viết tất cả logic bạn cần cho mình mọi lúc. Bạn có thể viết lớp lưu trữ / lưu trữ dữ liệu của riêng bạn hoặc - nếu bạn quá bận rộn - chỉ cần viết SQL tùy chỉnh cho mỗi lần truy cập cơ sở dữ liệu. Bạn có thể viết các lớp xác thực và xử lý phiên của riêng bạn. Và logic của riêng bạn rending logic. Và logic xử lý ngoại lệ của riêng bạn. Và chức năng bảo mật của riêng bạn. Và khung kiểm tra đơn vị của riêng bạn để đảm bảo tất cả đều hoạt động tốt. Và của riêng bạn ... [diễn ra khá lâu]

Sau đó, một lần nữa, nếu bạn làm sử dụng một khuôn khổ , bạn sẽ có thể hưởng lợi từ việc tốt, thường là peer-xem xét và rất tốt kiểm tra công việc của hàng chục thậm chí hàng trăm các nhà phát triển khác, những người cũng có thể là tốt hơn so với bạn. Bạn sẽ có thể xây dựng những gì bạn muốn một cách nhanh chóng, mà không phải mất thời gian xây dựng hoặc lo lắng quá nhiều về các hạng mục cơ sở hạ tầng được liệt kê ở trên.

Bạn có thể hoàn thành nhiều việc hơn trong thời gian ngắn hơn và biết rằng mã khung bạn đang sử dụng hoặc mở rộng rất có thể sẽ được thực hiện tốt hơn so với việc bạn tự làm tất cả.

Và chi phí này? Đầu tư một số thời gian học khung. Nhưng - vì hầu như mọi nhà phát triển web sẽ chứng thực - nó chắc chắn đáng để dành thời gian học hỏi để nhận được lợi ích lớn (thực sự, khổng lồ) từ việc sử dụng bất kỳ khuôn khổ nào bạn chọn.


17
Tại sao không đưa năng lượng đó vào đóng góp cho một khung công tác nguồn mở, thay vì đả kích công cụ của riêng bạn? 'Một mình, chúng ta có thể di chuyển đá; cùng nhau chúng ta có thể di chuyển những ngọn núi 'và tất cả những thứ đó
Steve Jalim

7
@Jefffrey "Sau đó, bạn sẽ học như thế nào? Làm thế nào bạn sẽ lớn lên như một lập trình viên?" Tìm hiểu tuy nhiên bạn muốn, nhưng nếu bạn có ý định làm việc cho một khách hàng thực sự, bạn nên cung cấp giải pháp tốt nhất có thể trong khoảng thời gian ngắn nhất. Mã "có thể có lỗi" của bạn không được chấp nhận cho điều đó.
Cmorales

6
@Cmorales, nếu bạn muốn học ngôn ngữ lập trình hoặc bất kỳ vấn đề cụ thể nào về tên miền, bạn chắc chắn sẽ không có khách hàng "thực sự" nào (và bạn có thể có nhiều thời gian trong tay) và đó là lý do tôi đề xuất người mới không bắt đầu từ khuôn khổ.
Giày

3
@Jefffrey Bạn không nói gì về người mới trong bình luận của bạn, đó là chung chung. Tôi đồng ý rằng bạn nên tự học trước, nhưng nhận xét của bạn không chỉ rõ điều đó và trong thực tế (công việc) bạn không đủ khả năng sử dụng mã lỗi chỉ để học. Tôi biết một số kẻ không sử dụng khung vì họ nghĩ rằng họ biết rõ hơn ... và dành gấp đôi thời gian cho mỗi dự án.
Cmorales

1
@Cmorales Tôi cũng biết một số người sử dụng khung nhưng cũng mất gấp đôi thời gian cho mỗi dự án. Tốc độ lập trình không phải lúc nào cũng liên quan đến các công cụ đang được sử dụng.
Cypher

53

Tóm tắt tại Wikipedia (Khung phần mềm) (lần đầu tiên Google nhấn btw) giải thích khá rõ:

Một khung phần mềm, trong lập trình máy tính, là một sự trừu tượng trong đó mã phổ biến cung cấp chức năng chung có thể được ghi đè một cách chọn lọc hoặc chuyên biệt bởi mã người dùng cung cấp chức năng cụ thể. Các khung là một trường hợp đặc biệt của các thư viện phần mềm ở chỗ chúng là các bản tóm tắt có thể tái sử dụng được gói trong một giao diện lập trình ứng dụng (API) được xác định rõ, tuy nhiên chúng chứa một số tính năng phân biệt chính tách biệt chúng với các thư viện thông thường.

Các khung phần mềm có các tính năng phân biệt này tách chúng khỏi các thư viện hoặc các ứng dụng người dùng thông thường:

  1. đảo ngược điều khiển - Trong một khung, không giống như trong các thư viện hoặc các ứng dụng người dùng thông thường, luồng điều khiển chung của chương trình không bị người gọi quyết định, mà bởi khung. [1]
  2. hành vi mặc định - Một khung có hành vi mặc định. Hành vi mặc định này thực sự phải là một số hành vi hữu ích và không phải là một loạt các hành vi không.
  3. khả năng mở rộng - Một khung có thể được mở rộng bởi người dùng thường bằng cách ghi đè có chọn lọc hoặc chuyên biệt bằng mã người dùng cung cấp chức năng cụ thể.
  4. mã khung không thể sửa đổi - Nói chung, mã khung không được phép sửa đổi. Người dùng có thể mở rộng khung, nhưng không sửa đổi mã của nó.

Bạn có thể "cần" nó bởi vì nó có thể cung cấp cho bạn một lối tắt tuyệt vời khi phát triển ứng dụng, vì nó chứa rất nhiều chức năng đã được viết và thử nghiệm. Lý do khá giống với lý do chúng tôi sử dụng các thư viện phần mềm.


13
phần màu trắng trong câu trả lời của bạn tốt hơn phần màu xám, theo loại câu hỏi ...
OlimilOops

Tôi khá chắc chắn rằng người đặt câu hỏi cũng tìm thấy mục Wikipedia ... Anh ấy / Cô ấy có lẽ đang tìm kiếm một câu trả lời toàn diện hơn.
Stophface

31

Rất nhiều câu trả lời hay, nhưng hãy để tôi xem liệu tôi có thể cho bạn một quan điểm khác không.

Đơn giản hóa mọi thứ khá nhiều, bạn có thể xem một khung như một ứng dụng hoàn chỉnh ngoại trừ chức năng thực tế. Bạn cắm chức năng và UY TÍN! bạn có một ứng dụng

Hãy xem xét, nói, một khung GUI. Khung này chứa mọi thứ bạn cần để tạo một ứng dụng. Thật vậy, bạn thường có thể tạo ra một ứng dụng tối thiểu với rất ít dòng hoàn toàn không có gì - nhưng nó cung cấp cho bạn quản lý cửa sổ, quản lý cửa sổ phụ, menu, thanh nút, v.v. Đó là khía cạnh khung của mọi thứ. Bằng cách thêm chức năng ứng dụng của bạn và "cắm nó" vào đúng vị trí trong khung, bạn biến ứng dụng trống này không có gì khác ngoài quản lý cửa sổ, v.v. thành một ứng dụng thực sự, toàn diện.

Có các loại khung tương tự cho ứng dụng web, cho ứng dụng phía máy chủ, v.v. Trong mỗi trường hợp, khung cung cấp phần lớn mã tẻ nhạt, lặp đi lặp lại (hy vọng) trong khi bạn cung cấp chức năng miền vấn đề thực tế. (Đây là lý tưởng. Trong thực tế, tất nhiên, sự thành công của khung rất thay đổi.)

Tôi nhấn mạnh một lần nữa rằng đây là quan điểm đơn giản về khung là gì. Tôi không sử dụng các thuật ngữ đáng sợ như "Đảo ngược kiểm soát" và tương tự mặc dù hầu hết các khung đều có các khái niệm đáng sợ như vậy. Vì bạn là người mới bắt đầu, tôi nghĩ tôi sẽ dành cho bạn biệt ngữ và đi với một sự mô phỏng dễ dàng.


14

Tôi không chắc chắn có một định nghĩa rõ ràng về "khung". Đôi khi một tập hợp lớn các thư viện được gọi là khung, nhưng tôi nghĩ cách sử dụng điển hình của từ này gần với định nghĩa aioobe mang lại.

Đây bài viết rất đẹp tóm tắt sự khác biệt giữa chỉ là một tập hợp các thư viện và một khuôn khổ:

Một khung có thể được định nghĩa là một tập hợp các thư viện nói rằng Đừng đừng gọi cho chúng tôi, chúng tôi sẽ gọi cho bạn.

Làm thế nào để một khung giúp bạn? Bởi vì thay vì viết một cái gì đó từ đầu, về cơ bản, bạn chỉ cần mở rộng một ứng dụng đang hoạt động. Bạn có được rất nhiều năng suất theo cách này - đôi khi ứng dụng kết quả có thể phức tạp hơn nhiều so với bạn có thể tự làm trong cùng khung thời gian - nhưng bạn thường giao dịch rất linh hoạt.


8

Một lời giải thích đơn giản là: Khung là một giàn giáo mà bạn có thể xây dựng các ứng dụng xung quanh.

Một khung thường cung cấp một số chức năng cơ bản mà bạn có thể sử dụng và mở rộng để tạo ra các ứng dụng phức tạp hơn từ đó, có các khung cho tất cả các loại. Microsofts MVC framework là một ví dụ tốt về điều này. Nó cung cấp mọi thứ bạn cần để thoát khỏi trang web xây dựng mặt đất bằng cách sử dụng mẫu MVC, nó xử lý các yêu cầu web, tuyến đường và những thứ tương tự. Tất cả những gì bạn phải làm là triển khai "Bộ điều khiển" và cung cấp "Lượt xem" là hai cấu trúc được xác định bởi khung MVC. Khung MVC sau đó xử lý việc gọi bộ điều khiển của bạn và hiển thị quan điểm của bạn.

Có lẽ không phải là từ ngữ tốt nhất nhưng tôi hy vọng nó sẽ giúp


1
Trên thực tế, nó giống như xây dựng các ứng dụng vào giàn giáo hơn là xung quanh nó.
Jörg W Mittag

4

ở mức thấp nhất, khung là một môi trường, nơi bạn được cung cấp một bộ công cụ để làm việc với

công cụ này có dạng thư viện, tập tin cấu hình, v.v.

cái gọi là "môi trường" này cung cấp cho bạn thiết lập cơ bản (báo cáo lỗi, tệp nhật ký, cài đặt ngôn ngữ, v.v.) ... có thể được sửa đổi, mở rộng và xây dựng.

Mọi người thực sự không cần khuôn khổ, đó chỉ là vấn đề muốn tiết kiệm thời gian và những người khác chỉ là vấn đề sở thích cá nhân.

Mọi người sẽ biện minh rằng với một khung, bạn không phải viết mã từ đầu. Nhưng đó chỉ là những người nhầm lẫn thư viện với các khung công tác.

Tôi không thiên vị ở đây, tôi thực sự đang sử dụng một khung công tác ngay bây giờ.


4

Nói chung, Công việc khung là cấu trúc thực tế hoặc Khái niệm nhằm mục đích hỗ trợ hoặc Hướng dẫn cho việc xây dựng một số thứ mở rộng cấu trúc thành thứ gì đó hữu ích ...


2

Một khung cung cấp các chức năng / giải pháp cho khu vực vấn đề cụ thể.
Định nghĩa từ wiki :

Một khung phần mềm, trong lập trình máy tính, là một sự trừu tượng trong đó mã phổ biến cung cấp chức năng chung có thể được ghi đè một cách chọn lọc hoặc chuyên biệt bởi mã người dùng cung cấp chức năng cụ thể. Các khung là một trường hợp đặc biệt của các thư viện phần mềm ở chỗ chúng là các bản tóm tắt có thể tái sử dụng được gói trong một giao diện lập trình ứng dụng (API) được xác định rõ, tuy nhiên chúng chứa một số tính năng phân biệt chính tách biệt chúng với các thư viện thông thường.


Có một từ trong câu đầu tiên "trừu tượng". ý bạn là như thế nào ? chúng ta sử dụng sự trừu tượng ở đâu?
Kumaresan Perumal

2

Một khung giúp chúng ta về việc sử dụng "đã được tạo", một siêu hình có thể giống như,

nghĩ rằng vật liệu trái đất là ngôn ngữ lập trình,

và ví dụ "máy ảnh" là chương trình và bạn đã quyết định tạo sổ ghi chép. Bạn không cần phải tạo lại máy ảnh mọi lúc, bạn chỉ cần sử dụng khung trái đất (ví dụ: cửa hàng công nghệ) lấy máy ảnh và tích hợp nó vào máy tính xách tay của bạn.


2

Một khung có một số chức năng mà bạn có thể cần. bạn có thể cần một số loại mảng có cơ chế sắp xếp sẵn có. Hoặc có thể bạn cần một cửa sổ nơi bạn muốn đặt một số điều khiển, tất cả những gì bạn có thể tìm thấy trong một khung. đó là một loại CÔNG VIỆC kéo dài một KHUNG xung quanh công việc của bạn.

EDIT: OK Tôi sắp đào những gì các bạn đang cố nói với tôi;) có lẽ bạn chưa nhận thấy thông tin giữa các dòng "LÀM VIỆC kéo dài một KHUNG xung quanh ..." trước khi điều này ngày càng sâu hơn. Tôi cố gắng đưa ra một sàn cho nó với hy vọng bạn thật duyên dáng:
một lời giải thích tốt cho câu hỏi "Sự khác biệt giữa Thư viện và Khung" Tôi tìm thấy ở đây
http://ifacethoughts.net/2007/06/04/difference-b between- a-library-and-a-framework /


hoàn toàn không hiểu số phiếu giảm ... Tôi hoàn toàn choáng váng về điều đó. câu hỏi là loại câu hỏi cơ bản cho người mới bắt đầu và câu trả lời của tôi theo đó khá tốt ...
OlimilOops

4
Để rõ ràng: Tôi đã không bỏ phiếu. Tuy nhiên, những gì bạn đang nói là ở mức độ thấp hơn nhiều so với những gì một khung công tác quan tâm. Các bộ sưu tập và thuật toán sắp xếp là nhiều thư viện tiêu chuẩn hơn là các ví dụ.
bakkal

1
cảm ơn vì câu trả lời nhưng ... nó không phải là câu trả lời cho câu hỏi của tôi. theo câu hỏi của OP, việc phân biệt giữa "thư viện chuẩn" và "khung" là sai ở đây. ví dụ: trong khung .net, bạn có thể tìm thấy các bộ sưu tập không gian tên trong một phần của khung mà tôi chưa từng nghe ai nói rằng collecsion không gian tên không phải là một phần của .netframework. vì vậy câu trả lời của bạn cho câu hỏi của tôi là sai
OlimilOops

1
Đây là định nghĩa của một thư viện . Nó bỏ lỡ đặc điểm phân biệt của một khung đối lập với thư viện: Inversion of Control .
Jörg W Mittag

2

Ngoài các định nghĩa, đôi khi chỉ có thể hiểu được nếu bạn đã hiểu, một ví dụ đã giúp tôi.

Tôi nghĩ rằng tôi đã hiểu được khi hiểu về việc sắp xếp một danh sách trong .Net; một ví dụ về khung cung cấp chức năng được điều chỉnh bởi mã người dùng cung cấp chức năng cụ thể. Lấy List.Sort (IComparer). Thuật toán sắp xếp, nằm trong khung .Net trong phương thức Sắp xếp, cần thực hiện một loạt so sánh; đối tượng A đến trước hay sau đối tượng B? Nhưng bản thân Sort không có manh mối làm thế nào để so sánh; chỉ có loại được sắp xếp biết rằng. Bạn không thể viết một thuật toán sắp xếp so sánh có thể được nhiều người dùng sử dụng lại và dự đoán tất cả các loại khác nhau mà bạn sẽ được yêu cầu sắp xếp. Bạn phải để lại một chút công việc cho chính người dùng. Vì vậy, ở đây, sắp xếp, còn gọi là khung, gọi lại một phương thức trong mã người dùng, loại được sắp xếp để nó có thể thực hiện so sánh. (Hoặc một đại biểu có thể được sử dụng;

Tôi đã nhận được điều này phải không?

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.