Báo cáo thực tập: Đặc trưng các ngôn ngữ lập trình
Trang 1• Thiết kế : là quyết định trong chương trình cần có những gì.
• Lập mã : là sử dụng một ngôn ngữ lập trình để biểu diễn logic chương trình dưới dạng mà máy có thể đọc hiểu được và nhập tài liệu nội bộ vào chương trình đó
• Kiểm thử và bảo trì : là tìm hiểu và hiệu chỉnh các trục trặc của chương trình cúng như nấng cấp chương trình cho phù hợp với nhu cầu mới
• Xây dựng tài liệu : là sưu tập và thành lập các tài liệu hướng dẫn sử dụng với chương trình đó
II SƠ LƯỢC VỀ CÁC KỸ THUẬT LẬP TRÌNH
Ban đầu, những chương trình máy tính đầu tiên được viết dưới dạng tuyến tính, có nghĩa là các đoạn mã lệnh được viết một cách lần lượt từ trên xuống dưới để thực hiện lần lượt từng chức năng của chương trình, nhiều đoạn lệnh được chép lại khi chức năng này được dùng đến trong những chương trình khác, kỹ thuật lập trình lúc này mới chỉ ở mức sơ khai
Khi kích thước của các chương trình lớn dần lên cùng với những đòi hỏi ngày càng cao hơn của các phần mềm nảy sinh nhu cầu sử dụng lại những đoạn mã trong cũng như như cầu làm cho chương trình trở lên trong sáng hơn để tìm lỗi, sửa chữa và phát triển Nhu cầu này đánh dấu sự ra đời của phương pháp lập trình có cấu trúc Trong phương pháp này người ta chia nhỏ chương trình
Trang 2những người lập trình có thể sử dụng mà không cần để ý đến sự hoạt động bên trong của chúng như thế nào Đó chính là khái niệm trừu tượng hoá (Abstraction) mà ở đây là sự trừu tượng hoá về chức năng Có thể coi trừu tượng hoá như khả năng quan sát một sự việc nào đó mà không cần xem xét đến các chi tiết cụ thể bên trong của nó như thế nào Sự trừu tượng hoá chức năng chính là nền tảng của lập trình có cấu trúc Đây có thể coi là một bước tiến lớn trong lĩnh vực lập trình.
Tuy nhiên, dần dần phương pháp này dần dần không đủ khả năng đáp ứng với những đòi hỏi mới Đó là khi qui mô của phần mềm ngày càng lớn lên thì vìa trò của việc xây dựng các cấu trúc dữ liệu ngày càng tăng ngang hàng với kỹ năng lập trình (hay giải thuật) Các cấu trúc dữ liệu được sử dụng ngày càng
đa dạng rất dễ gây nên tình trạng lộn xộn và mất điều khiển Chính điều này
đã dẫn đến như cầu trừu trượng hoá đối với dữ liệu Khi có trừu tượng hoá dữ liệu thì các phần tử dữ liệu trong chương trình có thể được sử dụng ở bất cứ nơi nào mà không cần quan tâm đến cấu trúc mà người ta đã xây dựng cho nó Việc này tiết kiêm được nhiều thời gian và công sức khi lập trình
Như vậy, lý thuyết về hướng đối tượng được xây dựng trên cơ sở sự trừu tượng hoá ở mức cao về cả dữ liệu cũng như những hoạt động đi kèm với những dữ liệu đó Và cách tiếp cận hướng đối tượng này ngày càng được ứng dụng rộng rãi trong mọi lĩnh vực của tin học chữ không chỉ nằm bó hẹp trong phạm vi lập trình
Tiếp đó, trong sự phát triển của các sản phẩm thương mại đã xuất hiện nhu cầu phân mảnh đối tượng thành các thành phần nhỏ lẻ, có thể lắp ghép với nhau Đó chính là sự ra đời của các hướng tiếp cận module và component-base Như vậy, thay vì chỉ bán một sản phẩm nguyên khối với đầy đủ các chức năng, các hãng có thể bán cho khách hàng những thành phần nào mà họ cần Nhưng quan trọng nhất, đó là cách lập trình Các chương trình được chia thành các thành phần độc, thành các module riêng, có thể tái sử dụng cho các
Trang 3chương trình khác Việc lập trình giờ đây có thể xem là trò chời sắp chữ, lầy thành phần này ghép vào thành phần khác để tạo ra phầm mềm hay là một thành phần mới Ở đây, tính trừu tượng đã được nâng cao thêm một bước.Những kỹ thuật lập trình mới này đưa ra những quan niệm mới của giới lập trình, nó cũng ảnh hưởng cách thức làm việc của họ Kết hợp sử dụng các kỹ thuật lập trình trên, giới lập trình đã có những cách để giải quyết những bài toán khó trong các yêu cầu của phầm mềm hiện nay, đó là :
• Phải xây dựng chương trình sáng dễ đọc, dễ hiểu Có tính trừu tượng hoá cao
• Trong trường hợp chương trình có lỗi hoặc trong trường hợp muốn sửa đổi chương trình cho tốt hơn, mạnh hơn, người sử dụng chương trình
có thể sửa đổi một cách dễ dàng
• Chương trình đòi hỏi thời gian phát triển ngắn
• Có khả năng nâng cấp, chi nhỏ dễ dàng
• Tái sử dụng những chương trình có sẵn, tiết kiệm công sức và tiền của
đã bỏ ra
Có thể tổng kết các nhược điểm của các phương pháp lập trình như sau:
1 Lập trình tuyến tính vốn đã mang trong mình nó đầy rẫy những nhược điểm
như:
• Không có phương tiện để sử dụng lại phần mã lệnh đã viết từ trước làm cho các đoạn lệnh có thể bị lặp lại ở nhiều nơi trong chương trình dẫn tới mã lệnh dài, vất vả cho người lập trình, khó kiểm soát
• Chương trình được điều khiển để nhảy tới nhiều nơi trong mã lệnh- Không có cấu trúc, khi không giải thích rõ tại sao thì gây ra khó hiểu đôi khi ngay cả người lập trình đoạn mã đó khi xem lại cũng thấy khó khăn
Trang 4• Không có khả năng kiểm soát phạm vi nhìn thấy của dữ liệu Mọi dữ liệu trong chương trình đều được coi là toàn cục và có thể bị thay đổi ở bất cứ nơi đâu ==> khó kiểm soát và thiếu an toàn cho thông tin
2 Lập trình có cấu trúc dã giải quyết được hầu hết các nhược điểm của lập
trình tuyến tính bằng cách chia công việc thành các công việc nhỏ hơn tương ứng vói các thủ tục và hàm trong chương trình Đã phân biệt rõ đâu là biến toàn cục và đâu là biến cục bộ, cho phép ta sử dụng lại các đoạn mã đã viết từ trước nhưng nó vẫn còn tồn tại một số nhược điểm sau:
• Do chương trình bây giờ được chia làm các hàm và các thủ tục, các dữ liệu (trong đó có các dữ liệu dùng chung) được truy xuất trong nhiều hàm và thủ tục khác nhau Khi có sự thay đổi về kiểu dữ liệu đó thì sẽ đẫn đến ta phải hiệu chỉnh lại tất cả các đoạn mã có liên quan đến kiểu
dữ liệu vừa bị thay đổi
• Khi ta làm việc với nhóm, mỗi nhà lập trình được giao viết một tập các hàm và một tập các kiểu dữ liệu (trong đó có các kiểu dữ liệu dùng chung) Mỗi sự thay đổi về kiểu dữ liệu trong hàm, thủ tục của nhà lập trình viên này sẽ làm ảnh hưởng đến công việc của các nhà lập trình viên khác trong nhóm do đó phải mất nhiều thời gian để sửa lại chương trình
• Tuy nhiên không thể phủ nhận được một điều là, trong môi trường làm việc theo nhóm thì lập trình có cấu trúc là dễ thực hiện
3 Lập trình hướng đối tượng (OOP).
• Lập trình hướng đối tượng với nguyên lý kế thừa giúp ta loại bỏ được những đoạn chương trình khỏi lặp lại nhiều lần Mở rộng khả năng sử dụng của các lớp đã được xây dựng
Trang 5• Chương trình được xây dựng từ những đối tượng có trao đổi thông tin cho nhau Việc xây dựng được thực hiện theo quy trình chứ không phải dựa vào kinh nghiệm như trước từ đó rút ngắn được thời gian xây dựng
• Có các nguyên lý bảo vệ thông tin, thông tin chỉ có thể bị thay đổi bởi những đoạn chương trình có quyền thay đổi thông tin mà không thể là bất cứ đoạn chương trình nào khác
• Ta có thể ánh xạ đối tượng của bài toán vào đối tượng trong chương trình
• Những hệ thống hướng đối tượng dễ mở rộng và nâng cấp thành những
hệ thống lớn
• Có thể quản lý được độ phức tạp của những sản phẩm phần mềm
• Tuy nhiên không phải trong hệ thống hướng đối tượng nào cũng có đầy
đủ những ưu điểm trên Khả năng để có những tính chất trên còn phải phụ thuộc vào lĩnh vực của bài toán đề ra
4 Các ngôn ngữ lập trình đứng trên phương diện hướng đối tượng có thể chia
thành hai loại như sau:
• Ngôn ngữ dựa trên đối tượng (object-base): C, Pascal
• Ngôn ngữ lập trình hướng đối tượng (object-oriented)-Các đặc tính dựa trên hướng đối tượng + kế thừa + liên kết động: Smalltask, C++, Object Pascal
III LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG
Những khó khăn trong lập trình hướng cấu trúc :
Khi độ phức tạp của chương trình tăng lên, sự phụ thuộc của nó vào các kiểu
Trang 6trúc dữ liệu trong chương trình quan trọng không kém các phép toán thực hiện trên chúng Điều này trở nên hiển nhiên khi chương trình càng tăng về kích thước Các kiểu dữ liệu xử lý trong nhiều thủ tục bên trong một chương trình
có cấu trúc, và khi có sự thay đổi trong các kiểu dữ liệu này thì cũng phải thực hiện cả những thay đổi ở mọi nơi có các tác động lên kiểu dữ liệu đó Đây là một công việc tốn thời gian và hiệu quả đối với các chương trình có hàng nghìn dòng lệnh và hàng trăm hàm
Một nhược điểm nữa của lập trình có cấu trúc lộ ra khi cần phải dùng nhiều người để lập trình cho một ứng dụng Trong một chương trình có cấu trúc, từng người được giao xây dựng một tập các hàm và kiểu dữ liệu dùng chung cho lẫn nhau cho nên những thay đổi về cấu trúc dữ liệu của người này sẽ nh hưng tới công việc của người khác, những sai sót trong liên lạc giữa các thành viên trong nhóm có thể dẫn tới việc mất thời gian để viết lại
1 Lập trình hướng đối tượng là gì.
Lập trình hướng đối tượng (object oriented programming –gọi tắc là OOP) hay chi tiết hơn lập trình định hướng đối tượng chính là phương pháp lập trình lấy đối tượng (Object)làm nền tảng để xây dựng thuật giải xây dựng chương trình Các thao tác (thủ tục ) trong đối tượng được gọi là các phương thức (method) hay hành vi (behaviour) của đối tượng đó Phương thức và dữ liệu của đối tượng luôn luôn tác động lẫn nhau và có vai trò ngang nhau trong đối tượng Phương thức của đối tượng được qui định bởi dữ liệu và ngược lại
Dữ liệu của đối tượng được đặc trưng bởi các phương thức của đối tượng Chính nhờ sự gắn bó đó chúng ta có thể gửi cùng một thông điệp (message) đến những đối tượng khác nhau (mang một vài đặc điểm chung ) Điều này giúp người lập trình không phải xử lý trong chương trình của mình một dãy các cấu trúc điều khiển tùy theo thông điệp nhận vào, mà chương trình được
xử lý vào thời điểm thực hiện
Trang 7Tóm lại lập trình hướng đối tượng là ngôn ngữ hiện thực trong đó chương trình được tổ chức như tập hợp của những đối tượng hợp tác với nhau, mỗi đối tượng đại diện cho một vài lớp phân cấp thông qua quan hệ thừa kế Trong lập trình hướng đối tượng có một số khái niệm sau :
2 Tính trừu tượng (Abstraction) :
Sự trừu tượng thể hiện những đặc tính cốt yếu của một đối tượng mà những đặc tính này dùng để phân biệt đối tượng này với tất cả các loại đối tượng khác và do vậy cung cấp một cách rõ ràng giới hạn ý niệm được định nghĩa, liên quan tới viễn tưởng của người nhìn
Trừu tượng tập trung vào cái nhìn bề ngoài của đối tượng và do đó thoả mãn được các hành vi chủ yếu của đối tượng riêng biệt từ hiện thực của nó
3 Sự đóng kín (Encapsulation) :
Tính đóng kín là quá trình phân chia các phần tử của một trừu tượng để cấu thành nên cấu trúc và hành vi của chính nó , đóng kín cho phép hoạt động giao tiếp của một trừu tượng và hiện thực của nó
Sự đóng kín là cơ chế liên kết mã và dữ liệu mà nó thao tác , và giữ cho cả hai được an toàn khỏi sự có thể thiệp từ bên ngoài và do sự sử dụng sai Trong ngôn ngữ hướng đối tượng , mã và dữ liệu liên kết với nhau để tạo thành một
"hộp đen " độc lập Trong hộp này là tất cả mã và dữ liệu cần thiết Khi mã
và dữ liệu liên kết với nhau như thế một đối tượng sẽ được tạo ra Nói cách khác, đối tượng là một dụng cụ hỗ trợ cho sự đóng kín
Trong một đối tượng: mã , dữ liệu hoặc cả hai có thể là private ( riêng ) của đối tượng đó hay public ( chung ) Mã hoặc dữ liệu riêng là thuộc về đối tượng đó và chỉ được truy cập với bộ phận của đối tượng Nghĩa là mã hoặc
dữ liệu riêng không thể được truy cập bởi các phần khác của chương trình tồn tại ngoài đối tượng Khi dữ liệu là chung , các bộ phận khác của chương trình
Trang 8có thể truy cập nó mặc dù nó được định nghĩa trong một đối tượng Các phần chung của một đối tượng dùng để cung cập một giao diện có điều khiển cho các phần riêng của đối tượng
Nói chung , một đối tượng là một biến thuộc kiểu do người sử dụng định nghĩa Mỗi lần ta định nghĩa một đối tượng mới , ta tạo ra một loại dữ liệu mới
Tính trừu tượng và đóng kín là hai khái niệm bổ sung nhau : trừu tượng thì tập trung vào những hành vi có thể quan sát được của đối tượng , còn tính đóng kín tập trung vào hiện thực cho hành vi đó Tính đóng kín thường đạt được thông qua che dấu thông tin , tức là quá trình che dấu mọi bí mật của đối tượng mà không đóng góp vào đặc tính thiết yếu của đối tượng đó ; thông thường cấu trúc của đối tượng được che dấu cũng như hiện thực của những method của đối tượng
4 Bản chất của đối tượng và lớp trong lập trình hướng đối tượng
a Bản chất đối tượng :
Một đối tượng có trạng thái, hành vi, đặc tính nhân dạng; cấu trúc và hành vi của các đối tượng giống nhau được định nghĩa trong một lớp chung của chúng, thuật ngữ instance và đối tượng là có thể thay thế lẫn nhau được
Trạng thái (state) : của một đối tượng bao gồm tất cả các đặc tính (thường là tĩnh) của đối tượng
Hành vi (behavior ) : là đối tượng hoạt động và phản ứng như thế nào theo điều kiện trạng thái của nó thay đổi và thông điệp truyền đến nó
Thao tác (operations) : là một dịch vụ mà một lớp cung cấp cho các đối thượng của nó Chúng ta thấy rằng thường thực thi năm loại thao tác với đối tượng :
Trang 9 Modifier : là thao thay đổi trạng thái của đối tượng Selector : là thao tác truy xuất trạng thái của đối tượng nhưng không làm thay đổi trạng thái của nó.
Iterrator : là thao tác cho phép tất cả các phần của một đối tượng được truy xuất theo một thứ tự đã định nghĩa trước Hai loại thao tác thông dụng khác cần thiết để tạo và hủy những instance của một lớp là
Constructor: là operation tạo đối tượng và (hoặc) khởi động trạng thái của nó
Destructor :là operation giải phóng trạng thái của một đối tượng và (hoặc) hủy chính đối tượng đó
Indentify: (đặc điểm nhận dạng) : indentify là đặc tính của một đối tượng để phân biệt nó với các đối tượng khác
Mối quan hệ giữa các đối tượng:
• Links( liên kết) : Link là nối kết vật lý hay ý niệm giữa các đối tượng Một đối tượng cộng tác với một đối tượng khác thông qua link của nó tới những đối tượng này Hay nói cách khác, một link có nghĩa là một hợp tác cụ thể qua đó một đối tượng ( client) áp dụng những dịch vụ của đối tượng khác (nhà cung cấp) hoặc qua đó một đối tượng có thể điều khiển đối tượng khác
• Một đối tượng có thể đóng các vai trò sau:
Actor : một đối tượng có thể làm việc trên một đối tượng khác nhưng nó không bao giờ cho một đối tượng khác làm việc trên
nó, thuật ngữ actor và active object có thể thay thế lẫn nhau
Server: một đối tượng không bao giờ làm việc trên một đối tượng khác, nó chỉ cho đối tượng khác làm việc trên nó
Trang 10Agent : một đối tượng vừa làm việc trên đối tượng khác vừa cho đối tượng khác làm việc trên nó, một đại lý thường được tạo ra
để làm công việc cho một actor hay một agent khác
Có thể tóm lược bằng công thức sau :
b Bản chất của lớp trong lập trình hướng đối tượng
Class (lớp) là tập hợp của các đối tượng có cùng cấu trúc chung hay hành vi chung Một đối tượng đơn giản chỉ là một instance( thể hiện ) của lớp
Interface: của một lớp cho thấy bên ngoài của đối tượng và do đó nhấn mạnh đến vấn đề trừu tượng trong khi che dấu cấu trúc và hành vi bên trong
Implemention : của một lớp là cái nhìn bên trong của nó Implemention của một lớp cơ bản bao gồm tất cả các thao tác được định nghĩa trong interface Chúng ta chia interface của lớp thành ba phần:
Public : là khai báo được truy xuất đến mọi nơi
Protected : là khai báo được truy xuất chỉ chính lớp đó, lớp con của nó, và lớp friend
Private: là khai báo được truy xuất chỉ chính lớp đó và lớp friend
Ví dụ một lớp có thể được khai báo như sau :
Trang 11Mối quan hệ giữa các lớp:
Phần lớn ngôn ngữ hướng đối tượng hỗ trợ trực tiếp một vài kết hợp của những quan hệ sau đây:
• Association : gồm có quan hệ một-một, một-nhiều, nhiều-nhiều
• Inheritance (thừa kế) : là một lớp chia sẽ cấu trúc và (hoặc) hành vi được định nghĩa bởi một lớp (đơn thừa kế) hoặc nhiều lớp (đa thừa kế)
• Aggregation (kết tập) : quan hệ kết tập giữa các lớp giống như quan
hệ kết tập giữa các đối tượng tượng giữa các lớp đó
5 Tính thừa kế
Trước khi đề cập đến khái niệm kế thừa chúng ta tìm hiểu qua một ít về sự phân lớp các đối tượng Đây chính là sự xắp xếp các đối tượng, tổ chức sao cho thế giới thực (real world) đang kho sát nằm trong một khôn khổ nhất định Khi đó, nếu gặp được một đối tượng mới chúng ta dễ dàng đưa nó vào lớp thích hợp Sự phân lớp của đối tượng giúp cho hệ thống đơn giản hơn tập hợp lại các đối tượng có cùng những hành vi giao tiếp Sự phân lớp như vậy chính là bước đầu tiên trong việc xây dựng chương trình theo hướng đối tượng
Sau khi tiến hành phân lớp, công việc kế tiếp là xây dựng các lớp được dẫn xuất từ những lớp đã có – gọi là lớp cơ sở (hoặc là lớp cơ bản ) Những lớp này, ngoài tính chất riêng của mình, chúng còn giữ lại những đặc điểm của các lớp cơ sở, nói cách khác chúng thừa kế những hành vi và dữ liệu của lớp
cơ sở Lớp thừa kế từ lớp cơ sở gọi là lớp dẫn xuất Những lớp dẫn xuất này đến lượt chúng lại đóng vai trò lớp cơ sở của các lớp dẫn xuất khác
Với tính thừa kế chúng ta không phải mất công xây dựng lại từ đầu những đối tượng mới, chỉ cần bổ xung để có được những lớp dẫn xuất những đặc tính
Trang 12cần thiết Nhờ tính thừa kế, các đối tượng thuộc lớp khác nhau sẽ có cùng phương thức như những hành vi giao tiếp Khi đó chúng có thể gửi cùng một thông điệp đến tất cả đối tượng có cùng tính chất, đó chính là những đối tượng có cùng kiểu cơ sở
Thừa kế đơn : khi một lớp chuẩn bị xây dựng mang nhiều nét chung (dữ liệu, phương thức) với một lớp đã có, chúng ta quyết định ngay đây chính là lớp dẫn xuất từ lớp đã có đó Hoặc khi hai lớp chuẩn bị xây dựng có chung một số đặc điểm, chúng ta sẽ xây dựng một lớp cơ bản gồm phần chung đó và các lớp dẫn xuất sử dụng phần chung như lớp cơ bản
Ví dụ :
Lớp A sẽ là lớp cơ sở và lớp B ngoài những thuộc tính và phương thức của nó
sẽ thừa hưởng những thuộc tính và phương thức của lớp A
Thừa kế bội : Bên cạnh sự thừa kế đơn, để có thể mô tả một lớp rộng các vấn
đề của thực tế, ngôn ngữ hướng đối tượng còn cho phép cài đặt các lớp được mang trong mình những tính chất của nhiều lớp khác (như con cái ngoài sự thừa hưởng một số nét của cha, còn hưởng của mẹ ) Với sự thừa kế như vậy
ta đã biết với tên gọi thừa kế bội (multiple inheritance)
Class A
Class B
Class C