Bên cạnh sự đa dạng của ngôn ngữ lập trình, cũng dần có rất nhiều mô hình lập trình được ra đời, trong đó phổ biến nhất có thể kể đến như: Lập trình hướng đối tượng object-oriented progr
Trang 1ĐẠI HỌC BÁCH KHOA HÀ NỘI
Bộ môn: Kĩ thuật lập trình
TÌM HIỂU VỀ MỘT SỐ MÔ HÌNH LẬP TRÌNH
Giảng viên: Vũ Đức Vượng
Thực hiện:
Sinh viên: Nguyễn Bá Duy MSSV: 20121397
Lớp: CNTT 1.01
Hà Nội 19/01/2015
Trang 2Lời nói đầu
Bất kì một ngôn ngữ lập trình nào cũng đều mang tính logic cao và tuân theo những quy chuẩn cơ bản về toán học Tuy vậy, mỗi ngôn ngữ lại có những phương thức riêng để thực hiện những quy chuẩn đó, đặc biệt là trên các lĩnh vực như hàm (function), biến (variable), phương thức (method) và đối tượng (object) Bên cạnh sự đa dạng của ngôn ngữ lập trình, cũng dần có rất nhiều mô hình lập trình được ra đời, trong đó phổ biến nhất có thể kể đến như: Lập trình hướng đối
tượng (object-oriented programming), lập trình thủ tục(procedural programming)
và lập trình cấu trúc (structured programming) Mỗi một mô hình lập trình lại có những đặc trưng riêng về cách sử dụng cũng như tính trừu tượng hóa đối với các quá trình xác định
Các nhóm khác nhau trong công nghệ phần mềm đề xướng các phương pháp
khác nhau, các ngôn ngữ lập trình khác nhau tức là các mô hình lập trình khác nhau Một số ngôn ngữ được thiết kế để hỗ trợ một mô hình đặc thù (Java hỗ trợ lập trình hướng đối tượng trong khi Haskell hỗ trợ lập trình chức năng) Một số ngôn ngữ khác lại hỗ trợ nhiều mô hình (như Python và Common Lisp)
Một số mô hình lập trình cấm các thao tác mà chính ngôn ngữ đó có Chẳng hạn, lập trình cấu trúc không cho phép sử dụng lệnh goto Quan hệ giữa các mô hình lập trình và các ngôn ngữ lập trình có thể phức tạp vì một ngôn ngữ có thể hỗ trợ nhiều mô hình lập trình Thí dụ như C++ được thiết kế để hỗ trợ các phần tử của lập trình thủ tục, lập trình hướng đối tượng và lập trình tiêu bản
Mặc dù vậy, những người thiết kế và những người lập trình sẽ quyết định làm thế nào để xây dựng một chương trình dùng các phần tử của mô hình nào đó Người ta có thể viết một chương trình hoàn toàn theo kiểu lập trình thủ tục trong C++, cũng có thể viết chương trình hoàn toàn hướng đối tượng, hay viết chương trình có các phần tử của cả hai mô hình
Ở thời kz đầu, công nghệ phần mềm hoàn toàn dựa trên những thao tác lập
trình bằng mã nhị phân hoặc mã máy, mà đại diện là các giá trị 0 và 1 Điều này khiến cho quá trình thiết kế, kiểm soát sự hoạt động cũng như sửa lỗi đối với một ứng dụng trở nên vô cùng rắc rối và không hiệu quả Chúng ta coi những phương thức lập trình ở thời điểm này thuộc mô hình lập trình bậc thấp (low-level
programming paradigm) Về sau, cùng với sự phát triển của công nghệ, những hạn chế của giai đoạn đầu tiên dần được xóa bỏ với sự ra đời của các ngôn ngữ lập trình thế hệ thứ 3 là COBOL, Fortran và BASIC, đồng thời, một mô hình lập trình mới cũng xuất hiện và vẫn tiếp tục được sử dụng hiệu quả và phổ biến cho đến ngày nay, đó là mô hình lập trình thủ tục (procedural paradigm) Dần dần, chúng
ta chứng kiến sự phát triển mạnh mẽ về số lượng của các mô hình lập trình, mà
cơ bản có thể kể đến các mô hình sau:
1. Lập trình cấu trúc - Structured programming
Trang 32. Lập trình chức năng - Functional programming
3. Lập trình logic - Logical paradigm
4. Lập trình trực quan - Visual programming
5. Lập trình song song - Parallel programming
6. Lập trình phân tán - Distributed programming
7. Lập trình tương tranh - Concurrent programming
8. Lập trình định hướng đối tượng - Component-oriented programming
9. Lập trình cực độ - Extreme programming
…
Trang 4SƠ LƯỢC VỀ MỘT SỐ MÔ HÌNH LẬP TRÌNH PHỔ BIẾN
1 Functional programming.
Đặc điểm:
• Nguyên l{ và { tưởng: Toán học và lý thuyết về hàm
• Các giá trị đã được tạo là không thể biến đổi
• Trừu tượng hóa một biểu thức thành một hàm và ngược lại, một hàm có thể được tính toán như một biểu thức
• Hàm là lớp giá trị đầu tiên
• Hàm là những giá trị hoàn chỉnh, tương tự như số, danh sách
• Thích hợp với những tính toán theo yêu cầu
• Mở ra những khả năng mới
Functional Programming là thể loại lâu đời nhất trong ba paradigm lập trình chính Ngôn ngữ FP đầu tiên là IFP, được phát minh vào năm 1955, một năm trước khi có Fortran Sau đó, LISP ra đời năm 1958, một năm trước khi có COBOL Cả Fortran
và COBOL đều là những ngôn ngữ imperative (hay còn gọi là procedural) Chúng đặc biệt thành công khi được ứng dụng vào tính toán khoa học và nghiệp vụ, và trở thành paradigm thống trị trong suốt 30 năm đầu của kỉ nguyên thông tin Vào những năm 1970, Object-Oriented paradigm bắt đầu phát triển Cùng với sự trưởng thành của các ngôn ngữ lập trình hướng đối tượng, OO trở thành paradigm được sử dụng phổ biến nhất cho đến hiện nay
Trang 52 Logical paradigm
Khi mô tả bài toán dưới dạng logic vị từ, ta có thể yêu cầu hệ thống tìm kiếm các lời giải liên quan đến các khai báo đó Bài toán cần giải được xem là “mục tiêu”
mà hệthốngphảichứng minhtrêncơsở cáctrithứcđãđược khaibáo
Như thế, toàn bộ các kí hiệu của ngôn ngữ lập trình suy về một công thức đặc biệt:
- Phát sinhtừmộtyêu cầu
- Nhằm chứng minh một mục tiêu Để trả lời cho câu hỏi đó hệ thống xem nó như là một “đích” và cố chứng minh “đích” đó bằng cách tạo những suy diễntrêncơ sởcác trithức đãkhaibáo
Một ngôn ngữ logic có thể được dùng trong giai đoạn đặc tả yêu cầu của quy trình xây dựng một sản phẩm phần mềm Hơn thế nữa, logic vị từ cho phép biểu diễnhầu hết cáckháiniệmvà cácđịnhlí trong cácbộmônkhoahọc
Trang 63 Visual programing
Trong xu hướng phát triển mạnh mẽ hiện nay của tin học, số người sử dụng máy tính tăng lên rất nhanh và máy tính được sử dụng trong hầu hết các lĩnh vực của đời sống nên đòi hỏi các ngôn ngữ lập trình cũng phải đơn giản dễ sử dụng và mang tính đại chúng cao Chính vì vậy phương pháp lập trình trực quan ra đời
Đặc điểm của các ngôn ngữ lập trình trực quan là dễ sử dụng, triển khai các ứng dụng một cách nhanh chóng
4 Parallel programming.
Tính toán song (Parallel Computing) là việc chia một công việc ra thành các công việc nhỏ và cho các công việc này thực hiện đồng thời với nhau bởi các hệ thống có nhiều bộ vi xử lý (multiprocessor) hay bộ vi xử lý đa nhân (multicore) nhằm giảm thời gian thực hiện công việc đó xuống Việc lập trình để tách ra các công việc nhỏ và sắp xếp để xử lý song song thì được gọi là lập trình song song
Lập trình song song là một công việc rất phức tạp so với lập trình tuần tự thông thường, người phát triển phải thực hiện một quá trình “song song hóa”, biến đổi các chương trình tuần tự thành chương trình song song có khả năng tận dụng tối đa sức mạnh của hệ thống
Quá trình song song hóa gồm ba giai đoạn chính:
Phân chia chương trình thành các công việc con (Sub-task decomposition)
Phân tích sự phụ thuộc (Dependence anlysic) Định thời các công việc (Task scheduling)
Nói một cách dễ hiểu thì lập trình song song là lập trình để chạy được đa luồng với các dòng CPU đa nhân hiện nay (core i3, core i5, core i7,…)
Trang 75 Concurrent programming
Lập trình tương tranh là một trong những kỹ thuật quan trọng và cũng là một thách thức Một mặt, nó đem lại khả năng sử dụng hiệu quả cho những hệ thống song song và phân tán Mặt khác, những rủi ro trong việc tương tác giữa các tiên trình thực hiện đồng thời có thể gây ra những lỗi phần mềm không dễ dàng để tìm ra
Lập trình tương tranh, một số dòng lệnh có thể được thực hiện đồng thời Mỗi dòng lệnh là một chương trình tuần tự, ngoại trừ một thực tế là các dòng lệnh
có thể giao tiếp và gây trở ngại lẫn nhau Mỗi một dòng lệnh là một luồng, các chương trình tuần tự còn gọi là chương trình đơn luồng, còn chương trình viết theo phương pháp tương tranh là chương trình đa luồng
Đặc điểm:
Người dùng có thể tương tác với các ứng dụng khi tiến trình đang thực thi Những tiến trình chạy thời gian dài làm trì hoãn các tiến trình ngắn
Các chương trình phức tạp được thực hiện tốt hơn trên các bọ xử lý đa luồng
Những tiến trình đòi hỏi điều khiện tiên quyết có thể tạm dừng và đợi đến khi đáp ứng được để tiếp tục xử lý
6 Distributed programming.
Lập trình phân tán là một dạng của lập trình song song (tính toán song song) Lập trình song song tạo ra mối liên hệ giữa máy tính và các đơn vị tính toán, khiến chúng hoạt động đồng thời đối với một vấn đề cụ thể (dự báo thời tiết chẳng hạn) Các đơn vị tính toán có thể đặt rất gần nhau hoặc tách rời nhau Khi các đơn vị tính toán được đặt tách rời, ta gọi đó là lập trình phân tán Với mô hình lập trình này, các đơn vị tính toán thường rất khác nhau, cũng như sự khác nhau giữa các hệ điều hành và thiết lập mạng máy tính trở nên tương đối phức tạp và khó khăn
Lập trình mạng phân tán, thường có 2 khái niệm chính: peer to peer và client – server peer to peer là lập trình ngang hàng giữa 2 máy tính… còn lập trình client – server là lập trình cho phép n máy client kết nối tới m máy server – đây cũng là mô hình chúng ta sẽ gặp nhiều trong thực tế…
Trang 87 Extreme programming.
Extreme Programing là nổi tiến nhất của phương Agile (Agile Method) Nó được hình thành bởi một tập các thực nghiệm (practice) đơn giản nhưng phụ thuộc lẫn
nhau.Những pactice này làm việc với nhau để hình thành một dạng tổng quát hơn các thành phần của nó
Khách hàng là thành viên của nhóm phát triển (Cutomer team member)
Chúng ta mong muốn khách hàng và nhóm phát triển làm việc chung với nhau để
họ hiểu các vấn đề của nhau và cùng giải quyết các vấn đề đó
Vậy ai là khách hàng? Khách hàng của một nhóm XP là một nhóm người định nghĩa và xác định độ ưu tiên của chức năng hệ thống (hay sản phẩm) Đôi khi khách hàng là nhóm nhà phân tích nghiệp vụ hoặc chuyên gia marketing làm việc cùng một công ty phần mềm với nhóm phát triển Đôi khi khách hàng là một đâị diện của người dung Đôi khi khách hàng cũng chính là người trả tiền Nhưng trong một dự án XP, bất kể khách hàng là ai thì họ cũng là một thành viên của nhóm để phát triển
Tình huống tốt nhất là khách hàng làm việc với nhóm phát triển trong cùng một phòng Hoặc chí ít là làm việc ở nơi nào đó cách độ 100 feet so với phòng làm việc của nhóm phát triển Khoảng cách càng xa thì càng khó thỏa mãn điều kiện
“Customer team member” Nếu khách hàng làm việc trong một tòa nhà khác hoặc
ở một quốc gia khác thì càng khó mà yêu cầu họ tham gia cùng với nhóm
Chúng ta sẽ làm gì nếu khách hàng không thể ở gần nhóm phát triển? Lời khuyên của tôi là hãy tìm ai đó sẵn long làm việc chung và có thể đứng ở vai trò của một khách hàng thực thụ
Chu kỳ ngắn (Short C cles)
Một dự án XP sẽ giao sản phẩm dở dang (hay dự án đang thực hiện, cùng dịch từ chữ working project) mỗi 2 tuần Mỗi bước lặp 2 tuần Mỗi bước lặp 2 tuần này sản xuất ra một phần mềm dở dang đáp ứng một số yêu cầu nào đó của khách hàng Tại thời điểm cuối của bước lập, hệ thống được demo cho khách hàng xem
và nhận phản hồi của họ
Kế hoạch bước lặp:
Mỗi bước lặp thường kéo dài 2 tuần Nó đại diện cho một lần giao hàng thử,
có thể sẽ được hoặc không được them vào sản phẩm chính thức Nó là một tập các user story được chọn bởi khách dựa trên chi phí do nhóm phát triển đưa ra
Trang 9Nhóm phát triển đưa ra chi phí cho một bước lặp bằng cách đo chi phí của các bước lặp họ đã làm trước đó Khách hàng chọn tùy ý số lượng story cho bước lặp sao cho tổng chi phí ước lượng vượt quá ngân sách
Mỗi khi một bước lập được khởi động, khách hàng đồng ý không thay đổi định nghĩa của story và độ ưu tiên Trong suốt thời gian này, nhà phát triển tự do cắt các story thành các nhiệm vụ (task) cà tự do cài đặt các task này tùy theo thuận lợi về mặt kỹ thuật và kinh doanh
Kế hoạch phát triển:
Nhóm XP thường tạo ra kế hoạch phát hành tương ứng với mỗi 6 bước lặp Một bản phát hàn thường là thành quả của 3 tháng làm việc Nó đại diện cho 1 lần giao hàng chính và thường sẽ được đưa vào sản phẩm Một bản phát hành cũng bao gồm một tập các story được phân độ ưu tiên bởi khách hàng dựa trên ngân sách mà nhóm phát triển đưa ra
Nhóm phát triển xây dựng ngân sách cho 1 bản phát hành bằng cách đo chi phí tiêu tốn của những phiên bản phát hành trước Khách hàng có thể chọn số lượng bất kì các story cho 1 bản phát hành sao cho tổng các chi phí ước lượng không vượt quá ngân sách Khách hàng cũng xác định trình tự các story được cài đặt trong 1 bản phát hành Nếu muốn, nhóm phát triển cũng có thể đưa ra vài bước lập đầu tiên và xác định xem story nào sẽ được cài đặt trong bước lặp nào
Các bản phát hành không cố định, khách hàng có thể thay đổi nội dung bất
kì lúc nào Họ có thể hủy hoặc viết một story mới hoặc thay đổi độ ưu tiên của các story
Các chương trình kiểm tra sự thỏa mãn yêu cầu của sản phẩm (Acceptance Test)
Chi tiết về user story được thu nhập trong dạng thức của các acceptance test được đặc tả bởi khách hàng Các acceptance test của 1 story được viết ngay trước hoặc cùng lúc với việc cài đặt story đó Chúng được viết theo một ngôn ngữ kịch bản bất kì nào cho phép chúng chạy tự động và có thể lặp lại
Ngôn ngữ của acceptance test được phát triển và tiến hóa cùng với hệ thống Khách hàng có thể thuê nhóm phát triển tạo một hệ thống thực thi kịch bản đơn giản hoặc có thể họ có bộ phận kểm soát chất lượng (A) riêng để phát triển nó Nhiều khách hàng nhờ A phát triển công cụ cho việc kiểm tra độ thỏa mãn của sản phẩm và trực viết các acceptance test
Mỗi khi một acceptace test thành công, nó được thêm vào nhóm của những acceptance test đã thành công trước đó, và không bao giờ được phép thất bại
Trang 10Nhóm acceptance test tăng trưởng lên và sẽ được chạy nhiều lần trong ngày, hoặc chạy mỗi khi build hệ thống Nếu như các acceptance test thất bại thì build này được báo cáo là hỏng Như vậy mỗi khi yêu cầu được gọi là cài đặt xong thì nó sẽ không bao giờ bị vỡ Hệ thống chuyển từ trạng thái cũ sang trạng thái mới mà không bao giờ được phép không làm việc ( nghĩa là phải thỏa mãn các yêu cầu cũ lẫn mới) lâu hơn vài giờ
Lập trình theo cặp (Pải Programming)
Mã nguồng sản phẩm được viết bởi các cặp lập trình viên làm việc với nhau trên cùng một máy tính Một thành viên của 1 cặp sẽ giữ bàn phím và đánh code Thành viên còn lại sẽ quan sát code được đánh và tìm kiếm lỗi và cải tiến mã Cả 2 tương tác với nhau một cách lien tục và cả 2 cùng bận rộn với công việc viết phần mềm
Vai trò được thay đổi thường xuyên Người giữ bàn phím sẽ mệt mỏi và dẫn đến dễ sai lầm Người còn lại sẽ nhận lại bàn phím và điều khiển nó Bàn phím được hoán đổi nhiều lần giữa 2 người trong 1 giờ Mã nguồn kết quả được thiết kế
và được viết bởi cả 2 người Công sức của cả 2 là như nhau
Mối quan hệ theo cặp sẽ được thay đổi ít nhất 1 lần trong ngày để mỗi lập trình viên được làm việc ít nhất với 2 người trong ngày Xuyên suốt 1 bước lặp của
XP, mỗi thành viên của nhóm phát triển phải làm việc với mọi thành viên khác trong nhóm Và họ chỉ làm những công việc của trong nội dung của bước lặp đó
mà thôi
Điều này tăng cường sự trải rộng kiến thức cho toàn nhóm Trong khi kỹ thuật đặc trưng vẫn còn nguyên vẹn và các công việc yêu cầu kỹ thuật đặc trưng vẫn thường được giao cho các chuyên gia thì các chuyên gia này làm việc với hầu hết các thành viên còn lại trong nhóm Điều này sẽ trải rộng kiến thức cho toàn nhóm để các thành viên khác có thể thay thế cho chuyên gia trong các trường hợp khẩn cấp
Nguyên cứu của Laurie Williams và Nosek đã chỉ ra rằng việc theo cặp không những không giảm hiệu năng của đội ngũ lập trình mà nó còn gia giảm đáng
kể tỉ lệ sai sót
Sở hữu tập thể (Collective Ownership)
Một cặp có quyền check out và chỉnh sửa, cải tiến một module bất kì Không một lập trình viên nào chịu trách nhiệm cá nhân với một module bất kì hoặc một kĩ thuật bất kì Mọi người cùng làm việc với GUI Mọi người cùng làm việc với