Xây dựng các thuộc tính kèm theo giá trị thường được dùng cho từng lĩnh vực. Có nhiều phương pháp có thể tiến hành để lấy các thuộc tính của form như thống kế thủ công, tự động... Ở đây chúng tôi áp dụng phương pháp thống kê dựa trên kiến thức nhà phát triển.
B1: Phân tích các thuộc tính của các trang web Nn thuộc cùng lĩnh vực. B2: Lập bảng thống kê số lần xuất hiện của từng thuộc tính của mỗi trang. B3: Xây dựng thuộc tính chung thường được các trang sử dụng.
Ví dụ khi áp dụng cho chủ đề về Công việc, chúng tôi khảo sát các trang web sâu và tiến hành thống kê được các thuộc tính như bảng. Các giá trị của thuộc tính nhà phát triển có thể tiến hành thống kê từ các trang web hoặc tự chọn các giá trị theo nhu cầu. Quá trình thống kê thuộc tính theo lĩnh vực Công việc có thể xem phụ lục C.
STT Thuộc tính Giá trị 1 N gành nghề IT - Phần cứng/Mạng
IT Phần mềm Điện/Điện tử Giáo dục/Đào tạo
2 Tỉnh Thành phố Hồ Chí
Minh Hà N ội 3 Loại hình công việc Bán thời gian
Toàn thời gian Tập sự
4 Trình độ học vấn Trung học Cao đẳng Đại học 5 Việc được đăng cách đây 1 Tuần
2 tuần
Bảng 5-1: Minh họa các thuộc tính chung theo chủ đề Việc làm 5.2 Quá trình xây dựng công cụ hỗ trợ rút trích thông tin:
5.2.1 Giao diện ứng dụng:
Hệ thống của chúng tôi hỗ trợ nhà phát triển dễ dàng xây dựng ứng dụng web hay ứng dụng desktop dễ dàng thông qua các mẫu thiết kế. Chúng tôi xây dựng ứng dụng web hỗ trợ rút trích thông tin từ web Nn để hỗ trợ người dùng và ứng dụng desktop dùng để quản lý, hỗ trợ dành cho nhà phát triển.
Hình 5-1: Giao diện của ứng dụng web dành cho người sử dụng
Hình 5-3: Giao diện quản lý các thuộc tính chung
Hình 5-4: Giao diện quản lý các trang web Đối với người dùng:
Hình 5-1 là giao diện dành cho người sử dụng. Đầu tiên người dùng chọn chủ đề cần rút trích thông tin. Tùy theo chủ đề cụ thể mà những thuộc tính chung của chủ đề đó sẽ hiển thị khi người dùng chọn. N gười dùng nhập các yêu cầu, khi đó hệ thống sẽ xây dựng các câu truy vấn và gửi đến các trang web Nn đã được lưu trữ trong cơ sở dữ liệu, hệ thống thu thập kết quả trả về là các tệp tin .html và tiến hành rút trích thông tin. Kết quả được hiển thị cho người dùng.
Đối với nhà phát triển:
Giao diện chính của nhà phát triển chính là hình 5-2. Từ trình đơn, nhà phát triển chọn chức năng quản lý các chủ đề và các thuộc tính chung của chủ đề. Giao diện như hình 5-3 sẽ xuất hiện. N hà phát triển chọn chủ đề, và xem danh sách các thuộc tính. Mỗi thuộc tính được nhà phát triển chọn có thể có hay không có giá trị kèm theo.
Hình 5-4 là giao diện dành cho nhà phát triển quản lý các trang web và các biến thuộc form trang web đó. Mỗi trang web bao gồm tên, liên kết để gửi dữ liệu, phương thức gửi và thuật toán dùng để rút trích. Khi nhà phát triển chọn trang web nào đó, danh sách các biến thuộc form trang web đó sẽ được hiển thị.
5.2.2 Tổ chức lưu trữ thông tin các chủ đề và trang web jn
Thông tin về chủ đề và các trang web Nn được chúng tôi lưu trữ trong cơ sở dữ liệu. Sau đây là lược đồ cơ sở dữ liệu
Subject(ID, &ame): mô tả chủ đề cần rút trích. Mỗi chủ đề có một ID duy nhất
SubjectAttribute(ID, SubjectID, &ame, Component, Description): mô tả thông tin các thuộc tính. Mỗi thuộc tính thuộc một chủ đề cụ thể. Mỗi thuộc tính có một mã số duy nhất, tên, mô tả thuộc tính đó và component để dễ dàng xác định thuộc tính đó có cần thiết lưu trữ giá trị của thuộc tính hay không. Mỗi thuộc tính không có hoặc có nhiều giá trị.
SubjectAttributeValue(ID, SubjectAttributeID, SubjectAttributeValue):
mô tả giá trị của các thuộc tính.
Web(ID, SubjectID, &ame, LinkSearch, Method, Algorithm) mô tả thông tin trang web. Mỗi trang web thuộc một chủ đề duy nhất. Mỗi trang web có mã số, tên, lien kết để gửi yêu cầu, phương thức gửi đến trang web đó, và thuật toán áp dụng rút trích.
WebVariable(ID, WebID, &ame, Description) mô tả thông tin các biến của form của trang web. Mỗi biến thuộc một form của trang web. Các biến có tên biến và mô tả.
WebVariableValue(ID, VariableID, VariableSub&ame, VariableValue)
mô tả giá trị các biến. Trong các biến thuộc một form của trang web có những biến có nhiều giá trị và mỗi giá trị có một tên tương ứng.
Sau khi phân tích trang web bằng công cụ hỗ trợ, chúng tôi tiến hành Map giữa thuộc tính chung và tên các biến của từng trang web, Map giữa giá trị thuộc tính chung và giá trị tên biến của trang web. Công việc này được nhà phát triển tiến hành thủ công. Dữ liệu được lưu trữ trong 2 bảng: mapsubjectatt2webvariable và
mapsubjectattvalue2webvariablevalue.
MapSubjectAtt2WebVariable(ID, IDSubjectAttribute, IDWebVariable) MapSubjectAttValue2WebVariableValue(ID, IDSubjectAttributeValue, IDWebVariableValue)
Algorithm(ID, Algorithm&ame) mô tả các thuật toán. Mỗi thuật toán có 1 mã định danh duy nhất.
HiddenVariable(ID, WebID, Variable, Value) mô tả các biến Nn và giá trị kèm theo của 1 trang web nào đó.
Hình 5-5 : CSDL lưu thông tin chủ đề và trang web jn 5.2.3 Tổ chức lưu trữ thông tin cấu hình
Các thông tin cấu hình được lưu trữ trong metadata dưới dạng tệp tin .xml theo đúng chuNn bao gồm thông tin tên hành động và lớp xử lý. Các thông tin về hành động được đặt trong thẻ <config>. Ví dụ cấu hình hành động khi gửi yêu cầu search, controller sẽ điều phối đến lớp FormSearch xử lý.
<config>
<action name=”search” class=”FormSearch”> </config>
5.3 Cài đặt các thành phần có sử dụng mẫu thiết kế hướng đối tượng
5.3.1 Áp dụng mẫu thiết kế Dynamic Factory để điều hướng xử lý các yêu cầu
Sơ đồ lớp khi áp dụng như sau:
Hình 5-6: Sơ đồ lớp thành phần điều hướng xử lý yêu cầu
Hình 5-6 mô tả sơ đồ lớp thành phần điều hướng xử lý yêu cầu. Sau đây là mô tả chi tiết các lớp trong thành phần này:
• XMLParser: đọc thông tin cấu hình từ tệp tin XML thông quan phương thức
public Information LoadAction(String name. Thông tin cấu hình ở tệp tin XML minh họa như sau:
• Lớp Information lưu trữ thông tin về lớp xử lý các yêu cầu
<config>
<action name="welcome" class="FormSearch"/> <action name="search" class="Search"/>
Controller: Điều hướng đến lớp xử lý được lưu trữ trong lớp Information
GUI,FormsearchGUI, SearchGUI là các lớp xử lý tương ứng với các yêu cầu từ giao diện
Khi đó client chỉ cần gọi:
Controller controller = new Controller();
String servletAction = request.getServletPath();
5.3.2 Áp dụng mẫu Abstract Factory cho thành phần rút trích thông tin từ web jn nội dung động
Trong phần này, chúng tôi minh họa và phân tích mã nguồn của ứng dụng trong hai trường hợp (sử dụng mẫu thiết kế và không sử dụng mẫu thiết kế) để từ đó rút ra những nhận xét, so sánh một cách cụ thể.
5.3.2.1 Cách cài đặt thứ 1
Chúng tôi đưa ra trường hợp lập trình đơn giản và dễ hiểu nhất đứng trên quan điểm của lập trình viên như sau:
B1: Thiết kế cơ sở dữ liệu Chúng tôi tiến hành sử dụng cơ sở dữ liệu như đã trình bày.
B2: Thiết kế sơ đồ lớp
Hình 5-7: Cài đặt không dùng mẫu Abstract Factory Mô tả:
• Phương thức showGUI(String name): tùy thuộc vào tên của chủ đề mà truy vấn đến cơ sở dữ liệu để lấy các thuộc tính của chủ đề đó và phát sinh giao diện với các thuộc tính tương ứng.
• Phương thức queryDispatcher(String name, Information userInformation): tùy thuộc vào tên của chủ đề mà truy vấn đến cơ sở dữ liệu để lấy các trang web của chủ đề đó và dựa vào các thông tin mà người dùng đã chọn từ giao diện (kết quả trả về từ phương thức showGUI) tiến hành map giữa thuộc tính chủ đề và thuộc tính từng trang web, xây dựng các câu truy vấn gửi đến từng web thuộc chủ đề đó.
• Phương thức extractInformation(String file): rút trích các trang web mà queryDispatcher trả về.
5.3.2.2 Cách cài đặt thứ 2
Chúng tôi áp dụng mẫu Abstract Factory để xây dựng thành phần như sơ đồ sau:
Hình 5-8: Mẫu Abstract Factory cho thành phần rút trích thông tin từ web jn
Khi người dùng có nhu cầu rút trích thông tin một chủ đề nào đó, chỉ cần thay đổi điều kiện tạo lập factory, sẽ có một factory tương ứng với chủ đề đó. Lúc này sẽ phát sinh một nhóm các “sản phNm” tương ứng với chủ đề đó.
N ếu như số lượng trang web và số lượng chủ đề ít, ta có thể áp dụng trực tiếp mẫu này mà không cần sử dụng cơ sở dữ liệu. Tuy nhiên khi số lượng trang web nhiều làm cho công việc map các thuộc tính chung và các tên biến, map các giá trị thuộc tính và giá trị biến sẽ trở nên khó khăn. Khi bổ sung hay thay đổi chủ đề, trang web nhà phát triển phải bổ sung thêm lớp ứng với chủ đề đó, các phương thức ứng với từng trang web…
Do đặc điểm của bài toán là các phương thức của các họ “sản phNm” là các trang web có cài đặt các phương thức là tương tự nhau và mong muốn bổ sung các chủ đề một cách tự động mà không cần bổ sung lớp hay thay đổi code. Chúng tôi tiến hành lưu trữ các thông tin về chủ đề trong cơ sở dữ liệu và tổng quát hóa các phương thức bằng cách gom nhóm các factory và gom nhóm họ “sản phNm” thành một factory và một “sản phNm” tổng quát.
B1: Thiết kế cơ sở dữ liệu
Khi chuyển việc lưu trữ thông tin từ các lớp sang cơ sở dữ liệu quan hệ, ta có nhiều phương pháp chuyển đổi như: gộp tất cả các lớp trong cây kế thừa thành một, đNy các thuộc tính của lớp cơ sở xuống lớp kế thừa, mỗi bảng cho một lớp. Mỗi phương pháp đều có những ưu điểm và nhược điểm riêng. Ở đây, chúng tôi chọn phương pháp gộp tất cả các lớp trong cây kế thừa thành một.
• Tất cả các chủ đề, chúng tôi lưu trữ trong bảng chính là Subject, các thông tin chủ đề chúng tôi lưu trữ trong SubjectAttribute tương ứng với chủ đề đó. • Tất cả các trang web dùng để gửi, nhận truy vấn và tiến hành rút trích thông
tin, chúng tôi lưu trữ trong bảng Web. Các thông tin về form của trang web chúng tôi lưu trữ trong bảng WebVariable.
N hận xét: đây chính là cơ sở dữ liệu quan hệ mà chúng tôi đã trình bày trong cách lập trình thông thường.
B2: Xây dựng sơ đồ lớp khi cài đặt
Vì chúng tôi sử dụng cơ sở dữ liệu để lưu trữ các thông tin nên mẫu Abstract Factory khi cài đặt đã có sự thay đổi. Sơ đồ lớp lúc này như sau:
Các thành phần:
• Lớp Factory để tạo ra một tập các đối tượng tương ứng với chủ đề name • Interface GUI quản lý việc phát sinh giao diện dựa trên thuộc tính của chủ đề
name.
• Interface QueryDispatcher: quản lý việc truy vấn các trang web của chủ đề nam.
• Interface ExtractInformation: quản lý việc rút trích thông tin các trang web của chủ đề name.
Cài đặt:
AbstractFactory metaSearch = new SubjectFactory(); metaSearch.makeObject(info);
UsageProcess usageProcess = new UsageProcess(metaSearch); usageProcess.processQuery();
Tạo một factory cho 1 chủ đề cụ thể bằng makeObject(G)
Khi đó trong SubjectFactory sẽ cài đặt như sau:
Tạo ra GUI ứng với factory của chủ đề đó
Tạo QueryDispatcher ứng với factory chủ đề
Tạo InformationExtractor ứng với factory chủ đề
Trong Factory tương ứng với chủ đề cụ thể có thể tạo được 3 “sản phNm” cùng thuộc chủ đề đó bằng cách phương thức khởi tạo phù hợp do factory đó định nghĩa.
5.3.2.3 Kết luận
Khi áp dụng mẫu thiết kế Abstract factory để cài đặt chúng tôi nhận thấy có những ưu điểm sau:
• Việc phát sinh ra lớp sản xuất tùy thuộc vào Client chọn chủ đề nào. Khi đó, lớp sản xuất được phát sinh sẽ tạo lập một nhóm 3 đối tượng sản phNm tương ứng với chủ đề và người dùng không cần quan tâm về đối tượng đó được tạo lập như thế nào. Quá trình tạo lập các đối tượng sản phNm được che dấu hoàn toàn. Điều này hoàn toàn đúng với mô hình Abstract Factory định nghĩa ban đầu.
• Có thể dễ dàng chuyển đổi các đối tượng sản phNm: nhờ tính độc lập trên, khi cần thay đổi đối tượng sản phNm, Client chỉ việc thay đổi điều kiện tạo lập đối tượng sản xuất.
• Đây có thể xem như là một thư viện hỗ trợ cho các nhà phát triển tái sử dụng lại. N hà phát triển có thể cài đặt mới 1 lớp factory kế thừa từ Abstract Factory cho 1 chủ đề khác, bổ sung hay thay đổi các họ sản phNm cho phù hợp mà không ảnh hưởng đến hệ thống ban đầu.
5.3.3 Áp dụng mẫu thiết kế Strategy đóng gói thuật toán
Chúng tôi áp dụng mẫu thiết kế Strategy để xây dựng thành phần đóng gói các thuật toán. Sơ đồ lớp khi áp dụng như sau:
Hình 5-9: Sơ đổ lớp áp dụng mẫu thiết kế Strategy
Hình 5-9 mô tả sơ đồ lớp khi áp dụng mẫu thiết kế Strategy. Lớp Algorithm là lớp trừu tượng có phương thức ảo performAction dùng để tiến hành rút trích thông tin từ các tệp tin trong thư mục đầu vào. Các tên tệp tin .html tương ứng là tên các trang web trong cơ sở dữ liệu
public abstract void performAction(String path); public abstract class Algorithm
Các thuật toán cụ thể sẽ kế thừa lớp Algorithm và cài đặt lại phương thưc performAction. Chúng tôi minh họa trong ứng dụng là 2 thuật toán xử lý dựa trên xpath và dựa trên sự giống nhau về cấu trúc trang web, tương ứng với 2 lớp TextManipulationAlgorithm và lớp HeuristicAlgorithm.
Khi đó trong Context, ta chỉ cần
//tạo ñối tượng ñến thuận toán cần thực hiện
Algorithm al = new TextAlgorithm( );
//gọi hàm thực hiện
Chương 6 Kết luận và hướng phát triển
Tổng kết, đánh giá về các công việc đã làm và xác định hướng phát triển của đề tài.
6.1 Kết luận:
Chúng tôi đã trình bày việc vận dụng các mẫu thiết kế để xây dựng ứng dụng hỗ trợ rút trích thông tin từ web. Mục đích của chúng tôi là nêu bật vai trò của các mẫu thiết kế. Trong lĩnh vực xây dựng phần mềm, khi bắt đầu xây dựng một ứng dụng mới hay một chức năng mới, nhà phát triển phải suy nghĩ và xem xét về sự tương thích mã nguồn, khả năng tương tác giữa các đối tượng trong hệ thống... Khi đó mẫu thiết kế sẽ là một giải pháp nhằm giảm thời gian và chi phí cho việc thực hiện công việc. Dưới đây là một số nhận xét về chất lượng của ứng dụng hỗ trợ rút trích thông tin sau khi được áp dụng các mẫu thiết kế vào hệ thống trên.
• Tính đúng đắn, tính hiệu quả: phần mềm sau khi áp dụng các mẫu thiết kế đảm bảo tính đúng đắn, tính hiệu quả. N gười dùng vẫn có thể rút trích được thông tin chính xác tùy thuộc vào chủ đề cần rút trích và các yêu cầu của người dùng.
• Tính tiện dụng:
o Giao diện của mỗi chủ đề là tự động phát sinh dựa trên các thuộc tính của chủ đề đó.
o Dễ dàng điều hướng đến các lớp xử lý các yêu cầu thông qua tệp tin cấu hình.
o Chỉ cần thông qua Factory sẽ tự động tạo ra nhóm 3 “sản phNm” tương ứng chủ đề đã chọn.
o N hà phát triển có thể áp dụng thuật toán rút trích thông tin một cách linh hoạt.
• Tính tiến hóa: vận dụng các mẫu thiết kế giúp cho tính tiến hóa của phần mềm cao hơn.
o Khi cần thay đổi hay bổ sung hướng xử lý của một hành động, chỉ cần bổ sung một lớp kế thừa từ lớp action và cấu hình điều hướng trong tệp tin cấu hình.
o Khi cần thay đổi hay bổ sung một “sản phNm”, chỉ cần bổ sung một lớp và cài đặt việc khởi tạo “sản phNm” trong factory..
o Khi muốn áp dụng một thuật toán rút trích mới, nhà phát triển chỉ cần