Thật vậy, trong lĩnh vực ysinh mà cụ thể trong ytế đã xuất hiện các phương pháp mới với thiết bị kỹ thuật tiên tiến có sự trợ giúp đắc lực của công nghệ thông tin nhằm phục vụ chẩn đoán và điều trị bệnh. Có thể thấy rằng một trong những công việc thường xuyên phải làm là đo lường các tham số phản ánh trạng thái của cơ thể. Chính vì vậy để đáp ứng được nhu cầu này trên thực tế đã xuất hiện rất nhiều chủng loại thiết bị kỹ thuật y tế khác nhau như: máy điện tim, máy điện não, máy siêu âm, máy chụp cát lớp, máy chiếu xạ, máy phân tích xét nghiệm..vv trong đó việc ứng dụng công nghệ thông tin đã đóng góp đáng kể cho ngành y tế, tạo điều kiện thực hiện tốt các nhiệm vụ của ngành một cách nhanh chóng, chất lượng.
1 Đặt vấn đề Những năm gần đây trong khoa học công nghệ đã có những bớc phát triển đột phá, đặc biệt là trong công nghệ thông tin. Những ứng dụng hiệu quả của lĩnh vực này nhanh chóng xâm nhập vào mọi hoạt động khác nhau của cuộc sống. Thật vậy, trong lĩnh vực y-sinh mà cụ thể trong y-tế đã xuất hiện các phơng pháp mới với thiết bị kỹ thuật tiên tiến có sự trợ giúp đắc lực của công nghệ thông tin nhằm phục vụ chẩn đoán và điều trị bệnh. Có thể thấy rằng một trong những công việc thờng xuyên phải làm là đo lờng các tham số phản ánh trạng thái của cơ thể. Chính vì vậy để đáp ứng đợc nhu cầu này trên thực tế đã xuất hiện rất nhiều chủng loại thiết bị kỹ thuật y tế khác nhau nh: máy điện tim, máy điện não, máy siêu âm, máy chụp cát lớp, máy chiếu xạ, máy phân tích xét nghiệm vv trong đó việc ứng dụng công nghệ thông tin đã đóng góp đáng kể cho ngành y tế, tạo điều kiện thực hiện tốt các nhiệm vụ của ngành một cách nhanh chóng, chất lợng. Nh vậy công nghệ máy tính, kỹ thuật điện tử và công nghệ phần mềm đã trở nên những công cụ vô cùng quan trọng, không thể thiếu đợc trong các thiết bị điện tử y- sinh hiện đại. Chúng là những bộ phận cấu thành nên hệ thống thiết bị, giúp thực hiện những nhiệm vụ đặc biệt mà con ngời không thể thực hiện đợc hoặc nếu thực hiện thì rất tốn kém và mất rất nhiều thời gian và thậm chí ảnh hởng đến tính mạng. Đa số các thiết bị điện tử y-sinh hiện đại đều có hệ thống máy tính thu thập và xử lý số liệu đo lờng y-sinh phục vụ việc phân tích chẩn đoán và ra quyết định điều trị. Vì vậy xây dựng hệ thống thu thập số liệu đo lờng y-sinh có sự trợ giúp của máy tính và công nghệ phần mềm là một trong những yêu cầu thiết yếu của ngành y tế trong nớc nói chung và ở trong quân đội nói riêng. Hiện nay hầu hết các phần mềm thu thập số liệu đo lờng nói chung đều đợc xây dựng và phát triển dựa trên cơ sở các công nghệ COM, OLE, ActiveX. Do đó hiển nhiên là cần tiến hành nghiên cứu các công nghệ này và các kỹ thuật phát triển phần 2 mềm dựa trên chúng đồng thời nghiên cứu bản chất, đặc điểm của các tín hiệu điện sinh học để từ đó xây dựng hệ thống máy tính thu thập số liệu đo lờng y-sinh. Với ý đồ nh trên, tôi đã chọn đề tài nghiên cứu " ứ !"#$", cụ thể là nhằm xây dựng hệ thống thu thập số liệu 16 kênh tín hiệu từ thiết bị điện não đồ EEG-7400 của hãng NIHON KOHDEN (Nhật bản) thông qua card thu thập số liệu đa kênh AX5210H của hãng AXIOM. Hệ thống này có ý nghĩa lớn đối với việc phân tích, chẩn đoán điện não đồ trong các bệnh viện. Để thực hiện nhiệm vụ này luận văn sẽ giải quyết những nội dung chính sau: %&'()*!+ Tìm hiểu các khái niệm và đặc điểm cơ bản của công nghệ COM, OLE, ActiveX. Đặc biệt chú trọng đến công nghệ COM và vấn đề lập trình theo giao diện- một phong cách lập trình của COM. Bản chất và những u điểm bên trong của COM sẽ đợc bộc lộ thông qua việc xem xét các đoạn mã lệnh trong C/ C ++ , Java hoặc Visual Basic. %,' T-!$./0#1234!$ Tìm hiểu bản chất, đặc điểm của tín hiệu điện sinh học và đặc điểm đo lờng các chỉ tiêu y-sinh. Tạp âm, nhiễu trong tín hiệu điện sinh học, các bộ khuyếch đại tín hiệu điện sinh học và các phơng pháp lọc nhiễu đợc đề cập đến ở đây. Chơng 1 và chơng 2 sẽ làm cơ sở để tiến hành nghiên cứu và tìm hiểu các vấn đề trong chơng 3. %5' ứ!67 $!$ Xem xét tổ chức hệ thống phần cứng thu thập các kênh tín hiệu từ thiết bị điện não đồ EEG-7400. Sử dụng công nghệ COM, OLE, ActiveX xây dựng mô hình, thuật toán và chơng trình thu thập số liệu đồng thời 16 kênh tín hiệu điện não. Do công nghệ COM cho phép tận dụng thế mạnh của các ngôn ngữ lập trình khác nhau, 3 nên chơng trình sẽ đợc xây dựng dựa trên cả hai ngôn ngữ Visual Basic và Visual C + + . Visual Basic sẽ đợc sử dụng để thiết kế giao diện chơng trình và giải quyết các nhiệm vụ ở mức cao (mức ngời dùng), còn Visual C ++ sẽ giải quyết các vấn đề ở mức thấp (mức phần cứng). 89":!6; Trong phần này sẽ tổng kết các vấn đề đã đợc nghiên cứu tìm hiểu trong luận văn và đa ra kết luận về đánh giá kết quả cũng nh các hớng phát triển tiếp theo. Chơng 1 Tổng quan về công nghệ COM, OLE, ACTIVEX 1.1 Những vấn đề cơ bản về COM 1.1.1 COM là gì? Trớc hết COM là chữ viết tắt trong thuật ngữ tiếng Anh: 17<= 1 nghiã là 1>?/79. Có rất nhiều cách hiểu khác nhau về thuật ngữ này, dới đây nêu ra một vài quan niệm về COM : COM là kiến trúc phần mềm cho phép xây dựng các hệ thống và các ứng dụng từ các thành phần cung cấp bởi các dịch vụ phần mền khác nhau. Nó cũng là kiến trúc cơ sở để xây dựng nền tảng cho các dịch vụ phần mềm ở mức cao hơn. COM là một đặc tính dùng để viết các phần mềm có khả năng tái sử dụng chạy trên các hệ thống máy tính đợc xây dựng dựa trên cơ sở là các thành phần của nó. COM là một cấu trúc hạ tầng phức tạp cho phép các khách hàng và các đối t- ợng giao tiếp thông qua quá trình và phạm vi của máy chủ. COM là một phong cách lập trình chứa tập các quy tắc cần thiết để làm việc trong môi trờng lấy Microsoft làm trọng tâm(làm nhân). vv. 4 Nhng có lẽ các cách hiểu khác nhau về COM nh vậy có thể thâu tóm lại trong một khái niệm tổng quát nh sau: /1@A#B*!:2C D7D<BD>/1ED@2F. Trong hệ thống phần mềm máy tính, COM dựa trên việc tái sử dụng dới dạng mã nhị phân, gọi là tái sử dụng nhị phân, có nghiã là các thành phần (chơng trình phần mềm) của COM có thể sử dụng lại ở mọi nơi trong một PC hay một mạng LAN hoặc một hệ thống thông tin lớn mà không cần biết về mã chơng trình nguồn đã xây dựng lên nó, tức là không phụ thuộc vào mã nguồn. Đây là một trong những khía cạnh có ý nghĩa vô cùng to lớn của COM. COM đợc xây dựng dựa trên lập trình theo giao diện. Đây là một phong cách lập trình mà giao diện đợc tách ra khỏi quá trình thực thi của đối tợng thành phần- là một hay một vài đoạn mã nằm ở nơi nào đó trong bộ nhớ. Lập trình giao diện đã đợc khám phá trong các ngôn ngữ nh C/ C ++ và SmallTalk bởi các nhà phát triển phần mềm khi họ phát hiện ra rằng việc sử dụng các giao diện riêng biệt sẽ cho phép họ bảo trì và mở rộng các ứng dụng lớn một cách dễ dàng hơn. Các giao diện giải quyết đợc nhiều vấn đề liên quan đến việc tái sử dụng mã trong lập trình hớng đối t- ợng. Điểm mạnh của lập trình hớng đối tợng OOP(<=D8DD+11) là cho phép kế thừa mã thực thi. Kiểu kế thừa này thờng tạo ra sự ảnh hởng, phụ thuộc cứng lẫn nhau giữa các thành phần trong hệ thống, vì vậy gây ra nhiều khó khăn khi bảo trì và mở rộng cho một hệ thống lớn. Mặc dù Visual Basic không hỗ trợ tính thừa kế mã thực thi nhng từ Visual Basic 5.0 trở đi đã bổ xung, hỗ trợ việc GH+/2+ngời dùng. Sau đây sẽ đi tìm hiểu về lập trình theo giao diện, một phong cách lập trình trong COM. 1.1.2 Lập trình theo giao diện a/.Các lớp, các đối tợng và client 5 Trong mục này ta coi là đã làm quen với một ngôn ngữ lập trình hớng đối tợng, chẳng hạn nh C/C ++ . Vì vậy các khái niệm: +$$<= (lớp, đối tợng, khách) trong ngôn ngữ sẽ không đợc đề cập lại ở đây. Sau đây chúng ta sẽ tìm hiểu mối quan hệ giữa một client và một lớp. Trong mô hình hớng đối tợng một client thờng sử dụng một đối tợng đợc tạo ra từ một lớp. Trong Visual Basic, client thờng tạo ra đối tợng bằng cách dùng toán tử IJ đi sau tên của một lớp. Sau khi đối tợng đã đợc tạo ra, client sử dụng đối tợng bằng cách truy cập đến một trong các thuộc tính và phơng thức có sẵn của nó thông qua một biến, đó là một tham chiếu dựa vào lớp để truy cập các /4! của một đối tợng. Ví dụ, giả sử ta có một lớp , đoạn mã lệnh trong Visual Basic dới đây sẽ tạo ra đối tợng K và sử dụng các thuộc tính và phơng thức của nó: Dim Dog as Cdog ' L+<21@<:? Set Dog=IJ Cdog ' MD+1@?N4/K Dog.Name="Snoopy" ' (D!67:1@!@- Dog.Park ' (.1@7%O Trong ví dụ này rõ ràng việc truyền thông giữa client và đối tợng đợc thực hiện thông qua việc truy cập đến một tập các thuộc tính tiềm ẩn và các phơng thức chung và tập hợp này đợc biết đến nh là một +!của đối tợng. Một ích lợi to lớn của lớp là cho phép tái sử dụng mã, có nghĩa là có thể dùng lớp ở mọi chỗ trong một ứng dụng, giúp giảm tối thiểu mã thừa. Ngoài ra, các thuộc tính và các phơng thức của lớp có thể loại bỏ đợc nếu nó không phải là !@-/ 7%O!. Việc cải tiến các phơng thức của lớp chỉ đòi hỏi cú pháp gọi nó không đợc thay đổi. Có nghĩa là chừng nào giao diện chung vẫn đợc giữ nguyên thì có thể tạo ra bất kỳ sự thay đổi nào để cải tiến, thay đổi mã của một lớp mà không làm ảnh hởng đến mã của client. Tuy nhiên một khi đã đa vào giao diện chung của lớp một thuộc tính hoặc một phơng thức thì chúng ta không thể loại bỏ chúng đợc, 6 khía cạnh này mang tính chất cội nguồn, có nghĩa là giao diện chung phải đợc thiết kế thật cẩn thận ngay từ đầu và sử dụng các quy tắc mà lớp đề ra. Từ đó cho phép cải tiến, mở rộng mã đối tợng mà không phải viết lại mã client bằng cách sửa các lỗi và nâng cấp thực hiện các phơng thức. Các client mới đợc xây dựng sau khi lớp đợc sửa đổi hoặc nâng cấp có thể lấy đợc các u việt của bất cứ những gì đợc bổ xung vào giao diện. Ví dụ, hãy tởng tợng một phơng thức PD đợc thực hiện sau khi kết thúc phơng thức sủa Q+D" của chó, phơng thức PD đợc định nghĩa trong lớp với tham số là số nguyên 16 bit cho phép client yêu cầu số lần lăn của chó sau khi kết thúc sủa: Public Sub RollOver( ByRef Rolls as Integer) 'RS+7%O/E End Sub Mã thực hiện trong client nh sau: Dim Dog As Cdog, Rolls As Integer Set Dog = New Cdog Rolls=2000 Dog.RollOver Rolls Khi client chỉ yêu cầu số lần lăn nằm trong khoảng số nguyên 16 bit nh trong ví dụ trên thì ứng xử diễn ra bình thờng. Nhng khi client nuốn kích hoạt phơng thức PD với giá trị nằm ngoài khoảng giá trị của số nguyên 16 bit thì sao? Lúc này phải thay đổi kiểu tham số của phơng thức PD cho phù hợp với yêu cầu của client, chẳng hạn sử dụng kiểu số nguyên dài 32 bít (TDD). Đây là vấn đề nan giải thuộc về thiết kế và chỉ có hai cách để giải quyết các vấn đề nh thế, đó là: thay đổi dấu hiệu của phơng thức sau đó viết lại toàn bộ mã của client gọi đến nó hoặc để nguyên mọi thứ nh vậy và tìm cách loại bỏ các hạn chế của thiết kế ban đầu. 7 Tuy nhiên với mục đích bảo trì và mở rộng, có một cách trong thiết kế là không định nghĩa một phơng thức hay một thuộc tính ở trong giao diện chung nếu nó không đợc coi là sẽ tồn tại lâu dài. Vì vậy các lập trình viên có kinh nghiệm thờng khai báo toàn bộ tiềm năng dữ liệu ở kiểu thuộc tính riêng (8D+) và cho phép truy cập vào trạng thái của đối tợng thông qua các phơng thức chung (8!<), mà bất kỳ thành viên nào đợc khai báo kiểu riêng đều có thể thay đổi hoặc loại bỏ đợc, do đó ngăn chặn đợc mọi sự phụ thuộc của client vào việc xắp xếp dữ liệu thực của lớp. b/.Kế thừa thực thi Đây là đặc điểm rất phổ biến của OOP trong các ngôn ngữ C ++ , SmallTalk và Java. Kế thừa thực thi là một trong những cách để có đợc sự tái sử dụng mã trong mô hình hớng đối tợng. Trong kế thừa thực thi khi một lớp đợc định nghĩa nó có thể dùng lại mã của một lớp khác. Visual Basic hiện thời cha đợc hỗ trợ tính chất kế thừa thực thi, do đó lấy Java để làm ví dụ giải thích kế thừa thực thi là nh thế nào. Xét lớp Cdog của Java nh sau: Class Cdog { Public String Name;UU(DM2S+NV$+W Public void Bark()UUX/S+N {/*Mã thực thi phơng thức ở đây*/} Public void RollOver(int Rolls)UUX/S+N {/*Mã thực thi phơng thức ở đây*/} } Lớp Cdog ở trên đợc xem nh là F7D4, lớp Cbeagle sau đây, đợc gọi là F7F mở rộng lớp Cdog. Nó kế thừa toàn bộ các tiềm năng và phơng thức của lớp Cdog, tức là lớp Cbeagle có thể dùng lại tất cả những gì mà Cdog có: // Subclass 8 Class CBeagle extends CDog { // Trạng thái chó Beagle: // (!@-Y4Y?":Z+Z. Public String Color; UU(!@-1F41/V1/!W // ứng xử của chó Beagle: // 8%OPDVW?":Z+Z // ẩn thực thi phơng thức Bark() của lớp Cdog: Public void Bark() {/* Mã thực thi phơng thức Bark() cho lớp CBeagle */} // Cbeagle mở rộng CDog bởi việc thêm phơng thức mới: Public void FetchSlippers() {/* Mã thực thi phơng thức mới FetchSlippers ()*/} } Trong đoạn mã trên chỉ ra rằng: có thể mở rộng đó bằng cách loại bỏ mã thực thi phơng thức của nó nh trong trờng hợp phơng thức Q+D" và có thể thêm vào phơng thức mới nh phơng thức [\77D$. Kế thừa thực thi đợc sử dụng chỉ khi tồn tại mối quan hệ "là"(is a) giữa lớp trên và lớp dới, trong ví dụ trên chúng ta có thể nói "con chó săn là một con chó(a beagle is a dog)", vì vậy nó đã áp dụng kế thừa thực thi và đợc mô tả nh trên hình 1.1. Tơng tự nh vậy cũng có thể bổ xung thêm các tiềm năng mới khi định nghĩa lớp dới. Nếu ta tiếp tục định nghĩa một lớp mới sử dụng lại mã của lớp Cbeagle và cứ nh vậy vv thì sẽ hình thành nên cái gọi là thứ bậc kế thừa trong đó chứa các mức kế thừa đợc mô tả trên hình 2.2 giữa lớp trên và lớp dới. Đến đây chúng ta thấy rằng chỉ cần một biến đổi đơn lẻ ở các lớp trên, các lớp dới thứ bậc kế thừa sẽ tự động thừa h- ởng các thay đổi này. 9 H×nh 1.1-KÕ thõa thùc thi cho phÐp mét líp t¸i sö dông tr¹ng th¸i vµ øng xö cña mét líp kh¸c H×nh 1.2-Thø bËc kÕ thõa chØ ra c¸c mèi quan hÖ gi÷a c¸c líp trªn vµ c¸c líp díi trong mét øng dông Cdog Bark RollOver Name Cbeagle Bark Color Cbeagle kÕ thõa tõ Cdog Cbeagle Bark FetchSlippers Name Cterrier Bark ChaseCar Name Cboxer Bark ScareMailman Name Cdog Bark RollOver Name 10 Tóm lại, tính kế thừa thực thi cho phép một lớp tái sử dụng mã của một lớp khác và nếu tính chất này đợc sử dụng một cách đúng đắn thì nó sẽ trở thành một phơng pháp rất hiệu quả để bảo trì và mở rộng mã. *.(-+>#V81D7$1W: đây là một đặc điểm rất quan trọng khác nữa của OOP, cho phép một client có thể tham chiếu nhiều đối tợng khác nhau theo cùng một cách thức cho dù chúng đợc tạo ra từ các lớp khác nhau và có những ứng xử khác nhau, nhng tất nhiên các lớp này phải đợc mở rộng cùng từ một lớp nào đó. Hình dới đây mô tả một client có thể sử dụng tham chiếu để truyền thông với ba kiểu đối tợng: Hình 1.3-Kế thừa thực thi mang tính đa hình Xét đoạn mã Java sau: // Phơng thức này chấp nhận tất cả các đối tợng tợng tơng thích với lớp :// Public void MakeDogBark(CDog Dog) { Dog.Bark() // 2?"2+!N#$]27O"2+! // } <+ object DDD object <D object Client Tham chiếu dựa trên Cdog [...]... môi trờng mà không phơng hại đến bất kỳ một ứng dụng nào đang sử dụng nó (các ứng dụng này đợc gọi là các khách hàng) Điều này khoa học và hiệu quả hơn hẳn so với các chơng trình phần 15 mềm, hệ thống chơng trình đợc xây dựng dựa trên việc tái sử dụng mã nguồn, trong đó mỗi một sự thay đổi nhỏ đều đòi hỏi phải biên dịch lại từng dòng lệnh trong ứng dụng, một công việc vô cùng nặng nhọc và gây nhiều khó... chất "trong suốt vị trí" Toàn bộ các công việc phức tạp để chuẩn bị, gửi, nhận các gói tin của mạng đợc thực hiện bởi cơ sở hạ tầng phân tán của COM Trớc đây khi cha xuất hiện công nghệ COM, các nhà lập trình xây dựng các phần mềm ứng dụng lớn bằng cách biên dịch và liên kết hàng nghìn tệp mã nguồn đơn lẻ để tạo ra một file EXE (ứng dụng nguyên khối) chạy độc lập, điều này dẫn đến kích thớc của các tệp... trung vào các công nghệ OLE xây dựng dựa trên kiến trúc của OLE2.0, bao gồm sự cải tiến thành COM (OLE mạng-network OLE) và các công nghệ OLE cơ sở xây dựng bên trong hệ điều hành Hơn nữa, kiến trúc này đã cho phép các nhóm bên ngoài Microsoft phát triển, tạo ra các công nghệ quan trọng trong thị trờng dữ liệu thời gian thực, bán hàng tự động, chăm sóc sức khoẻ và nền công nghiệp bảo hiểm Thế còn OLE... Document của ứng dụng Ngoài ra ngời dùng có thể thao tác với dữ liệu của đối tợng trực tiếp trong ứng dụng thông qua dịch vụ kích hoạt tại chỗ mà không cần phải quay về khởi động lại ứng dụng đã tạo ra đối tợng đó Tức là có thể soạn thảo và thay đổi dữ liệu của đối tợng ngay trên ứng dụng nóng, khi đó giao diện ngời dùng sẽ bị thay đổi ở ứng dụng nóng thông qua các menu, toolbar vv của các ứng dụng đã tạo... mở rộng hệ thống Các thành phần COM cơ sở có thể đợc xây dựng trên các ngôn ngữ lập trình độc lập, khác nhau Đặc điểm quý báu này của mô hình đối tợng thành phần có ý nghĩa vô cùng to lớn trong việc tập trung lực lợng và trí tuệ của các lập trình viên ở mọi nơi, đặc biệt khi tiến hành xây dựng các hệ thống hoặc các dự án phần mềm lớn Mỗi lập trình viên hoặc một nhóm lập trình có nhiệm vụ xây dựng lên... mô tả khác nhau về OLE Đôi khi OLE đợc biết đến thông qua các công nghệ nh : công nghệ Compound Documents, Visual Editing, OLE Automation, COM, và OLE Controls Các mô tả nh vậy về OLE đều chỉ đúng một phần nào đó và không thể trở thành một định nghĩa đầy đủ về OLE đợc bởi vì OLE có kiến trúc mở, luôn đợc phát triển để có thêm những công nghệ mới Do vậy, một định nghĩa về OLE phải đảm bảo đợc tính đúng... ngay, do đó làm đơn giản hơn việc duy trì và mở rộng ứng dụng sau khi đã đợc cài đặt trong sản phẩm Với các tính chất đã nêu trên đây, COM thực sự là một công nghệ thành phần cơ bản có ý nghĩa to lớn trong việc phát triển các phần mềm ứng dụng và các hệ thống thông tin lớn 17 1.1.4 Các thành phần cơ bản của COM Trớc khi xem xét các thành phần cơ bản của COM, ta tìm hiểu về một số khái niệm quan trọng liên... hoặc hệ thống chơng trình cải tiến và phát triển trên cơ sở sử dụng lại mã nguồn Điều này thể hiện ở chỗ: sự cải tiến và phát triển hệ thống chơng trình chủ yếu chỉ tác động vào các thành phần COM hoặc biên dịch lại các thành phần của COM dựa trên các thành phần COM đã có Ví dụ đối với một phần mềm ứng dụng đợc xây dựng dựa trên các mô hình COM, khi muốn thay đổi (chẳng hạn nh sửa lỗi, vv) trong chơng... trong giao diện của nó Trình tự tạo ra một đối tợng nh thế này là rất phổ biến trong các ứng dụng COM, vì vậy COM đã cung cấp một chức năng cho phép thực hiện tất cả các công việc đó chỉ trong một lần gọi, đó là hàm CoCreateInstance sử dụng trên hệ thống cục bộ hoặc hàm CoCreateInstanceEx nếu giao tiếp với các hệ thống ở xa Hình 1.6 minh hoạ các quá trình diễn ra khi client yêu cầu tạo ra một đối tợng... mở, các đối tợng ở bên ngoài ứng dụng và giải quyết vấn đề về phiên bản Các giải pháp này liên quan đến các thành phần nhị phân trong hệ thống đang chạy hơn là các thành phần mã nguồn trong ứng dụng Đến đây có thể đặt ra câu hỏi: cái gì đã làm cho kiến trúc của COM và OLE có tính chất tái sử dụng? Trong nền công nghiệp phần mềm ngời ta đã bàn nhiều đến khả năng tái sử dụng mã và đã chú trọng đến các