Động lực học lập trình Java, Phần 3: Ứng dụng sự phản chiếu Xây dựng một khung công tác cho các đối số dòng lệnh pptx

16 299 0
Động lực học lập trình Java, Phần 3: Ứng dụng sự phản chiếu Xây dựng một khung công tác cho các đối số dòng lệnh pptx

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

Động lực học lập trình Java, Phần 3: Ứng dụng phản chiếu Xây dựng khung công tác cho đối số dòng lệnh Dennis Sosnoski, Nhà tư vấn, Sosnoski Software Solutions, Inc Tóm tắt: Xử lý đối số dịng lệnh việc vặt khó chịu mà dường tiếp tục xảy xung quanh bạn phải giải lần khứ Thay viết thay đổi mã lặp lặp lại, khơng sử dụng phản chiếu để đơn giản hóa công việc xử lý đối số? Nhà tư vấn Java Dennis Sosnoski cho bạn thấy cách làm Trong này, Dennis phác thảo thư viện mã nguồn mở, cho phép tạo đối số dòng lệnh để tự xử lý thực tế Trong viết tháng trước, giới thiệu Java Reflection API (API phản chiếu Java) trình bày qua số khả Tơi xem xét kỹ hiệu phản chiếu kết thúc số hướng dẫn cần hay không cần sử dụng phản chiếu ứng dụng Trong viết tháng này, xa cách xem xét ứng dụng dường phối hợp tốt cho điểm mạnh điểm yếu phản chiếu: thư viện để xử lý đối số dịng lệnh Tơi bắt đầu cách trước tiên xác định vấn đề cần giải quyết, sau thiết kế giao diện cho thư viện trước thực vào đoạn mã thực Kinh nghiệm thực tế phát triển thư viện chưa cấu trúc bắt đầu nỗ lực để làm đơn giản hóa mã có họ ứng dụng dùng sở mã chung, sau tổng quát hóa từ Tuy nhiên, trình tự theo đường thẳng "định nghĩa-thiết kế-xây dựng" viết ngắn gọn nhiều so với mơ tả đầy đủ q trình phát triển q trình tổ chức theo cách sửa lại số giả định ban đầu tơi xóa hết vài khía cạnh mã thư viện Hy vọng rằng, bạn tìm thấy có ích mơ hình để phát triển ứng dụng dựa phản chiếu riêng bạn Xác định vấn đề Tôi viết nhiều ứng dụng Java cách sử dụng đối số từ dòng lệnh Hầu hết bắt đầu thực nhỏ, số kết thúc phát triển ngày xa kế hoạch ban đầu tơi Có mơ hình chuẩn mà tơi quan sát thấy theo cách q trình hoạt động với tơi: Đừng bỏ lỡ phần lại loạt Phần 1, "Các lớp Java nạp lớp" (04.2003) Phần 2, "Giới thiệu phản chiếu" (06.2003) Phần 4, "Chuyển đổi lớp Javassist" (09.2003) Phần 5, "Việc chuyển lớp hoạt động" (02.2004) Phần 6, "Các thay đổi hướng-khía cạnh với Javassist" (03.2004) Phần 7, "Kỹ thuật bytecode với BCEL" (04.2004) Phần 8, "Thay phản chiếu việc tạo mã" (06.2004) Bắt đầu với hai đối số cần thiết theo thứ tự cụ thể Hãy suy nghĩ nhiều thứ mà ứng dụng nên làm, sau thêm vào nhiều đối số Cảm thấy mệt mỏi việc gõ tất đối số lần, tạo số đối số tùy chọn, với giá trị mặc định Quên thứ tự đối số, thay đổi mã phép chúng theo thứ tự Cung cấp ứng dụng cho người khác quan tâm Họ đối số có nghĩa vụ phải làm, đó, thêm phần kiểm tra lỗi tốt "trợ giúp" mô tả cho đối số Theo thời gian đến bước thường thấy tiếc tơi bắt đầu tồn q trình vị trí May mắn thay, tơi có xu hướng quên giai đoạn sau nhanh vịng hai tuần tơi nghĩ ứng dụng dòng lệnh khác đơn giản chút mà tơi muốn có Sau cịn vấn đề thời gian trước lặp lặp lại tồn chu kỳ khó chịu Có số thư viện có sẵn để trợ giúp việc xử lý đối số dịng lệnh Tuy nhiên, tơi bỏ qua chúng theo cách riêng viết Đây khơng phải (chỉ) tơi có quan điểm "không sáng tác đây", mà để sử dụng việc xử lý đối số ví dụ Khi điều xảy ra, điểm mạnh điểm yếu phản chiếu phối hợp tốt với yêu cầu cho thư viện xử lý đối số Cụ thể là, thư viện xử lý đối số:  Cần giao diện linh hoạt để hỗ trợ loạt ứng dụng  Phải dễ dàng cấu hình cho ứng dụng  Khơng địi hỏi hiệu cao nhất, đối số xử lý lần  Khơng có vấn đề bảo mật truy cập, ứng dụng dịng lệnh thường chạy mà khơng có trình quản lý bảo mật Mã phản chiếu thực tế thư viện trình bày phần nhỏ việc việc thực đầy đủ, tơi chủ yếu tập trung vào khía cạnh có liên quan đến phản chiếu Nếu bạn muốn tìm hiểu thêm thư viện (và có lẽ sử dụng cho ứng dụng dịng lệnh đơn giản riêng bạn), bạn tìm liên kết tới trang Web phần Tài nguyên Hỏi chuyên gia: Dennis Sosnoski vấn đề JVM bytecode Đối với ý kiến hay câu hỏi tài liệu trình bày loạt này, điều khác có liên quan đến Java bytecode, định dạng lớp nhị phân Java vấn đề JVM chung, truy cập vào diễn đàn thảo luận JVM Bytecode, Dennis Sosnoski kiểm sốt Phác thảo thiết kế Có lẽ cách thuận tiện để ứng dụng truy cập liệu đối số thông qua trường đối tượng ứng dụng Ví dụ, giả sử bạn viết ứng dụng tạo kế hoạch kinh doanh Bạn muốn sử dụng cờ boolean (toán tử boolean) để kiểm soát xem kế hoạch kinh doanh có ngắn gọn hay dài dịng khơng, int cho doanh thu năm đầu tiên, float cho tỷ lệ tăng trưởng doanh thu hỗn hợp dự kiến String cho việc mô tả sản phẩm Tôi gọi biến này, biến có ảnh hưởng đến hoạt động tham số ứng dụng để phân biệt chúng với đối số thực tế (các giá trị cho biến tham số) cung cấp dòng lệnh Việc sử dụng trường cho tham số làm cho chúng dễ dàng có sẵn điểm mã ứng dụng mà cần chúng Nó dễ dàng để thiết lập giá trị mặc định cho tham số điểm định nghĩa sử dụng trường, thể Liệt kê 1: Liệt kê Trình tạo kế hoạch kinh doanh (liệt kê phần) public class PlanGen { private boolean m_isConcise; // rarely used, default false private int m_initialRevenue = 1000; // thousands, default is 1M private float m_growthRate = 1.5; // default is 50% growth rate private String m_productDescription = // McD look out, here I come "eFood - (Really) Fast Food Online"; private int revenueForYear(int year) { return (int)(m_initialRevenue * Math.pow(m_growthRate, year-1)); } Sự phản chiếu cho truy cập trực tiếp đến trường riêng, cho phép thư viện xử lý đối số thiết lập giá trị mà khơng có kết nối đặc biệt vào mã ứng dụng Tuy nhiên, cần số đường cho thư viện để liên kết trường tới đối số dịng lệnh cụ thể Trước tơi định nghĩa cách liên kết đối số trường truyền dẫn đến thư viện, lần cần phải định cách muốn định dạng đối số dòng lệnh Đối với viết này, tơi xác định định dạng dịng lệnh, phiên đơn giản hóa quy tắc UNIX Các giá trị đối số cho tham số cung cấp theo thứ tự bất kỳ, với gạch nối đầu để thị đối số cho nhiều cờ tham số ký tự đơn (như trái ngược với giá trị tham số thực tế) Đối với trình tạo kế hoạch kinh doanh (business plan generator), chọn ký tự cờ tham số này:  c kế hoạch ngắn gọn  f doanh thu năm (hàng nghìn Đơla Mỹ-$)  g tốc độ tăng trưởng (hệ số nhân hàng năm)  n tên sản phẩm Các tham số boolean cần ký tự cờ để thiết lập giá trị, kiểu khác tham số yêu cầu số phân loại thông tin đối số bổ sung Tôi viết thêm vào giá trị đối số số trực tiếp sau ký tự cờ tham số (có nghĩa khơng thể sử dụng số làm ký tự cờ), tham số có giá trị-String mà tơi sử dụng đối số ký tự cờ dòng lệnh giá trị thực tế Cuối cùng, có tham số cần thiết (như tên tệp kết cho trình tạo kế hoạch kinh doanh), tơi giả định giá trị đối số cho tham số theo sau giá trị tham số tùy chọn dòng lệnh Căn vào quy tắc này, dịng lệnh cho trình tạo kế hoạch kinh doanh trơng sau: java PlanGen -c -f2500 -g2.5 -n "iSue4U - Litigation at Internet Speed" plan.txt Khi tất đặt nhau, ý nghĩa đối số là:  -c tạo kế hoạch ngắn gọn  -f2500 doanh thu năm 2.500.000 đô la Mỹ  -g2.5 tốc độ tăng trưởng 250 phần trăm năm  -n "iSue4U " tên sản phẩm "iSue4U "  plan.txt tên tập tin kết cần thiết Vào lúc này, có đặc tả chức cho thư viện xử lý đối số Bước xác định giao diện cụ thể cho mã ứng dụng để sử dụng thư viện Chọn giao diện Bạn điều khiển việc xử lý thực tế đối số dòng lệnh với gọi, trước tiên ứng dụng cần cách để định nghĩa tham số cụ thể cho thư viện Các tham số có số kiểu khác (trong trường hợp ví dụ trình tạo kế hoạch kinh doanh, chúng boolean, int, float java.lang.String) Mỗi kiểu có số yêu cầu đặc biệt Ví dụ, thật thú vị phép tham số boolean định nghĩa false (sai) có ký tự cờ này, thay ln ln true (đúng) có ký tự cờ Cũng có ích để xác định phạm vi hợp lệ cho giá trị int Tôi xử lý yêu cầu khác cách sử dụng lớp sở cho tất định nghĩa tham số, phân lớp cho kiểu tham số cụ thể Cách tiếp cận cho phép ứng dụng cung cấp định nghĩa tham số cho thư viện mảng cá thể lớp định nghĩa tham số bản, định nghĩa thực tế sử dụng lớp cụ thể phối hợp với kiểu tham số Với ví dụ trình tạo kế hoạch kinh doanh, điều đưa dạng hiển thị Liệt kê 2: Liệt kê Các định nghĩa tham số cho trình tạo kế hoạch kinh doanh private static final ParameterDef[] PARM_DEFS = { new BoolDef('c', "m_isConcise"), new IntDef('f', "m_initialRevenue", 10, 10000), new FloatDef('g', "m_growthRate", 1.0, 100.0), new StringDef('n', "m_productDescription") } Với tham số phép định nghĩa mảng, gọi từ chương trình ứng dụng tới mã xử lý đối số trì đơn giản gọi tới phương thức tĩnh tốt Để tính đến đối số thêm vào xác định mảng tham số (hoặc giá trị cần thiết tập giá trị chiều dài thay đổi), tơi có gọi trả số lượng thực đối số xử lý Điều cho phép kiểm tra ứng dụng cho đối số bổ sung sử dụng chúng cách thích hợp Kết cuối trông Liệt kê 3: Liệt kê Sử dụng thư viện public class PlanGen { private static final ParameterDef[] PARM_DEFS = { }; public static void main(String[] args) { // if no arguments are supplied, assume help is needed if (args.length > 0) { // process arguments directly to instance PlanGen inst = new PlanGen(); int next = ArgumentProcessor.processArgs (args, PARM_DEFS, inst); // next unused argument is output file name if (next >= args.length) { System.err.println("Missing required output file name"); System.exit(1); } File outf = new File(args[next++]); } else { System.out.println("\nUsage: java PlanGen " + "[-options] file\nOptions are:\n c concise plan\n" + "f first year revenue (K$)\n g growth rate\n" + "n product description"); } } } Phần lại việc xử lý tạo báo cáo lỗi (chẳng hạn ký tự cờ tham số không rõ giá trị số ngồi dải) Với mục đích này, xác định ArgumentErrorException lỗi ngoại lệ không kiểm tra đưa lỗi xảy Nếu lỗi ngoại lệ khơng nhận ra, làm hỏng ứng dụng với thông báo lỗi vết tích ngăn xếp kết xuất bàn điều khiển Như lựa chọn, bạn nhận lỗi ngoại lệ trực tiếp mã bạn xử lý số cách khác (ví dụ, in thơng báo lỗi thực tế với việc thông tin cách sử dụng) Thực thư viện Đối với thư viện để sử dụng phản chiếu lập kế hoạch, cần phải tìm kiếm trường xác định mảng định nghĩa tham số sau lưu trữ giá trị thích hợp tới trường từ đối số dòng lệnh tương ứng Nhiệm vụ xử lý cách tìm kiếm thông tin trường cần thiết cho đối số dịng lệnh thực tế, thay vào tơi thực lựa chọn để tách việc tìm kiếm khỏi cách sử dụng Tơi tìm thấy tất trường trước, sau cần sử dụng thơng tin tìm thấy q trình xử lý đối số Tìm trước tất trường bước lập trình an tồn để loại bỏ vấn đề tiềm dùng phản chiếu Nếu tơi tìm kiếm trường cần thiết, thật dễ dàng để phá vỡ định nghĩa tham số (ví dụ, cách khơng gõ tên trường tương ứng) mà khơng nhận có điều sai Sẽ khơng có lỗi thời gian-dịch tên trường chuyển qua String, chí chương trình thực tốt miễn khơng có đối số khớp với định nghĩa tham số bị ngắt xác định dịng lệnh Kiểu lỗi có đánh dấu dễ dàng làm cho việc chuyển dịch mã bị hỏng Dựa vào tơi muốn tìm thơng tin trường trước xử lý đối số thực tế, Liệt kê cho thấy việc thực lớp cho định nghĩa tham với phương thức bindToClass() để xử lý tìm kiếm trường Liệt kê Lớp sở cho định nghĩa tham số public abstract class ParameterDef { protected char m_char; protected String m_name; protected Field m_field; // argument flag character // parameter field name // actual parameter field protected ParameterDef(char chr, String name) { m_char = chr; m_name = name; } public char getFlag() { return m_char; } protected void bindToClass(Class clas) { try { // handle the field look up and accessibility m_field = clas.getDeclaredField(m_name); m_field.setAccessible(true); } catch (NoSuchFieldException ex) { throw new IllegalArgumentException("Field '" + m_name + "' not found in " + clas.getName()); } } public abstract void handle(ArgumentProcessor proc); } Việc thực thư viện thực tế bao gồm vài lớp ngồi mà tơi đề cập viết Tơi khơng duyệt tồn danh sách đây, hầu hết khơng liên quan đến khía cạnh phản chiếu thư viện Tơi đề cập đến mà tơi chọn để lưu trữ đối tượng đích trường lớp ArgumentProcessor thực cài đặt thực tế trường tham số lớp Cách tiếp cận đưa mẫu đơn giản cho việc xử lý đối số: lớp ArgumentProcessor quét đối số để tìm cờ tham số, tìm kiếm định nghĩa tham số tương ứng cho cờ (mà cờ ln lớp ParameterDef) gọi phương thức handle() định nghĩa Phương thức handle() gọi phương thức setValue() ArgumentProcessor sau giải thích giá trị đối số Liệt kê cho thấy phiên phần lớp ArgumentProcessor bao gồm gọi liên kết tham số hàm tạo phương thức setValue(): Liệt kê Liệt kê phần lớp thư viện public class ArgumentProcessor { private Object m_targetObject; // parameter value object private int m_currentIndex; // current argument position public ArgumentProcessor(ParameterDef[] parms, Object target) { // bind all parameters to target class for (int i = 0; i < parms.length; i++) { parms[i].bindToClass(target.getClass()); } // save target object for later use m_targetObject = target; } public void setValue(Object value, Field field) { try { // set parameter field value using reflection field.set(m_targetObject, value); } catch (IllegalAccessException ex) { throw new IllegalArgumentException("Field " + field.getName() + " is not accessible in object of class " + m_targetObject.getClass().getName()); } } public void reportArgumentError(char flag, String text) { throw new ArgumentErrorException(text + " for argument '" + flag + "' in argument " + m_currentIndex); } public static int processArgs(String[] args, ParameterDef[] parms, Object target) { ArgumentProcessor inst = new ArgumentProcessor(parms, target); } } Cuối cùng, Liệt kê cho thấy việc thực phần lớp định nghĩa tham số cho giá trị tham số int Điều có việc ghi đè phương thức bindToClass() lớp sở (từ Liệt kê 4) phương thức trước tiên gọi thực lớp sở sau kiểm tra xem trường tìm thấy có ăn khớp với kiểu dự kiến khơng Các lớp cho kiểu tham số cụ thể khác (boolean, float, String, v.v) giống Liệt kê 6.Lớp định nghĩa tham số int public class IntDef extends ParameterDef { private int m_min; // minimum allowed value private int m_max; // maximum allowed value public IntDef(char chr, String name, int min, int max) { super(chr, name); m_min = min; m_max = max; } protected void bindToClass(Class clas) { super.bindToClass(clas); Class type = m_field.getType(); if (type != Integer.class && type != Integer.TYPE) { throw new IllegalArgumentException("Field '" + m_name + "'in " + clas.getName() + " is not of type int"); } } public void handle(ArgumentProcessor proc) { // set up for validating boolean minus = false; boolean digits = false; int value = 0; // convert number supplied in argument list to 'value' // make sure we have a valid value value = minus ? -value : value; if (!digits) { proc.reportArgumentError(m_char, "Missing value"); } else if (value < m_min || value > m_max) { proc.reportArgumentError(m_char, "Value out of range"); } else { proc.setValue(new Integer(value), m_field); } } } Đóng lại thư viện Trong viết này, duyệt qua việc thiết kế thư viện để xử lý đối số dòng lệnh ví dụ phản chiếu hoạt động Thư viện tạo minh hoạ tốt cách sử dụng phản chiếu có hiệu làm đơn giản mã ứng dụng mà hy sinh hiệu đáng kể Phải từ bỏ hiệu năng? Trong số phép thử nghiệm nhanh hệ thống phát triển tôi, chương trình thử nghiệm đơn giản lấy trung bình dài khoảng 40 giây để thực việc xử lý đối số sử dụng thư viện đầy đủ, so sánh với việc xử lý khơng có đối số Phần lớn thời gian biểu diễn việc nạp lớp thư viện lớp khác mã thư viện sử dụng, với ứng dụng có nhiều tham số dịng lệnh định nghĩa nhiều giá trị đối số, xấu điều Đối với ứng dụng dịng lệnh tơi, 40 giây thêm vào khơng phải mà tơi thơng báo Mã thư viện đầy đủ có sẵn từ đường liên kết phần Tài nguyên Nó bao gồm số tính mà tơi để ngồi viết này, bao gồm nhiều điều thú vị kết nối để dễ dàng tạo danh sách có định dạng cờ mô tả tham số để giúp cung cấp hướng dẫn cách sử dụng cho ứng dụng Bạn việc sử dụng thư viện chương trình riêng bạn mở rộng theo cách mà bạn thấy có ích Bây tơi trình bày điều lớp Java Phần nguyên tắc Java Reflection API Phần Phần 3, phần lại loạt tránh theo đường người qua lại thao tác bytecode Tôi bắt đầu dễ dàng Phần với việc xem xét thư viện Javassist thân thiện với người dùng để làm việc với lớp nhị phân Bạn có muốn thử phương thức chuyển đổi không, miễn cưỡng để bắt đầu lập trình theo bytecode? Javassist công cụ phù hợp với nhu cầu bạn Hãy tìm hiểu Javassist vào tháng tới Đôi nét tác giả Dennis Sosnoski nhà tư vấn nhà trợ giúp đào tạo chuyên dịch vụ Web SOA dựa trên-Java Kinh nghiệm phát triển phần mềm chuyên nghiệp ông trải suốt 30 năm qua, với thập kỉ cuối tập trung vào cơng nghệ XML Java phía máy chủ Dennis nhà phát triển hàng đầu dụng cụ liên kết liệu XML JiBX mã nguồn mở, người có duyên nợ với khung cơng tác dịch vụ Web Apache Axis2 Ơng thành viên nhóm chuyên gia đặc tả kỹ thuật Jax-WS 2.0 JAXB 2.0 Xem trang web ơng để có thơng tin dịch vụ đào tạo tư vấn ông Mục lục  Xác định vấn đề  Chọn giao diện  Thực thư viện  Đóng lại thư viện ... chúng với đối số thực tế (các giá trị cho biến tham số) cung cấp dòng lệnh Việc sử dụng trường cho tham số làm cho chúng dễ dàng có sẵn điểm mã ứng dụng mà cần chúng Nó dễ dàng để thiết lập giá... xử lý đối số dòng lệnh ví dụ phản chiếu hoạt động Thư viện tạo minh hoạ tốt cách sử dụng phản chiếu có hiệu làm đơn giản mã ứng dụng mà hy sinh hiệu đáng kể Phải từ bỏ hiệu năng? Trong số phép... thay đổi), tơi có gọi trả số lượng thực đối số xử lý Điều cho phép kiểm tra ứng dụng cho đối số bổ sung sử dụng chúng cách thích hợp Kết cuối trơng Liệt kê 3: Liệt kê Sử dụng thư viện public class

Ngày đăng: 07/08/2014, 10:22

Từ khóa liên quan

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan