DI ĐỘNG VÀ PHƯƠNG PHÁP PHÁT TRIỂN LINH HOẠT
2.2. Kỹ thuật phân tích và tái cấu trúc mã nguồn để nâng cao hiệu năng của ứng dụng d
2.2.4.5. Cài đặt luật phân tích và thay đổi mã nguồn
Cơ sở để xây dựng các luật dựa trên [11, 100,86], các luật trong nghiên cứu của
luận án này được xây dựng có chứa thêm những thơng tin hữu ích để sử dụng sau này.
Thơng tin này có thể cung cấp cho người sử dụng một cái nhìn sâu hơn về luật để họ có thể tránh vi phạm luật mà không phải nhờ sự hỗ trợ của ứng dụng về sau.
Các bộ luật được xây dựng dựa trên các nhóm luật (xem Bảng 2.2):
o Giảm tiêu thụ năng lượng: giảm hoạt động CPU, giảm màu sắc độ sáng, giảm các hoạt động mạng.
o Các luật tổng quát, luật chung (có thể áp dụng cho các ngơn ngữ lập trình khác nhau).
o Các luật đặc tả dành riêng cho ngôn ngữ lập trình Java sau đó là các file XML để hiển thị bố cục của giao diện ứng dụng (layout).
o Các luật giúp cải tiến cho mã nguồn sáng sủa hơn, dễ dàng bảo trì hơn. o Các luật giúp giảm các chi phí khác.
Bảng 2.2: Danh sách các luật đã thực hiện trong phạm vi của luận án
STT Tên luật Mô tả
1 FinalVariable Gán cho các biến thuộc tính “final” nếu giá trị của nó khơng thay đổi
2 FieldShouldBeStatic Các thuộc tính “final” nên là “static”
3 AlwaysReuseImmutable- Nên sử dụng các đối tượng bất biến(constant) nếu ConstantObjectsForBetter- có thể
MemoryUtilization
4 UnusedVariable Các biến khơng được sử dụng nên bị loại bỏ 5 UncalledPrivateMethod Các phương thức “private” không được sử dụng
nên được loại bỏ
6 ShouldBeStaticInnerClass Các lớp trong nên sử dụng là tĩnh nếu có thể 7 AvoidUsingMathClass- Tránh sử dụng các phương thức của lớp “Math”
MethodsOnConstant trên các hằng số
8 ConstantExpression Các biểu thức mà giá trị của nó là hằng số nên được tính tốn ln
9 UseShiftOperators Nên sử dụng các phép toán dịch bit thay cho các phép toán nhân chia cho lũy thừa của 2
10 UseShortCircuit- Sử dụng “||”, “&&” thay cho “|”, “&” BooleanOperators
STT Tên luật Mô tả
11 UseStringLength- Sử dụng “String.length()” thay cho CompareEmptyString “String.equal()” khi kiểm tra xâu rỗng
12 UseStringEqualsIgnoreCase Sử dụng “String.equalsIgnoreCase()” thay cho “String.equals()” khi so sánh xâu chuỗi nếu có thể 13 AvoidUnnecessarySubstring Tránh sử dụng “String.substring()” nếu không cần
thiết
14 AvoidUsingStringCharAt Tránh sử dụng “String.charAt()” nếu có thể 15 AvoidConcatenatingString- Tránh sử dụng toán tử “+” của lớp “String” để nối
UsingPlusOperatorInLoop chuỗi trong vòng lặp
16 UseSingleQuotesWhen- Khi nối một ký tự vào một chuỗi, sử dụng dấu nháy ConcatenatingCharacter- đơn (kiểu “char”) thay vì dấu nháy kép (kiểu
ToString “String”)
17 AvoidUsingStringTokenizer Tránh sử dụng “StringTokenizer”
18 Nếu chỉ khởi tạo các đối tuợng từ lớp bao của các BoxedPrimitiveJust- kiểu dữ liệu nguyên thủy để sử dụng phương thức
CallToString “toString()” thì có thể sử dụng phương thức tính “toString()” của những lớp bao đó thay thế 19 AvoidConstructing- Tránh khởi tạo các đối tuợng của lớp bao của các
PrimitiveType kiểu dữ liệu nguyên thủy qua toán tử “new” 20 AvoidInstantiation-ForGetCla Tránh khởi tạo đối tuợng chỉ để gọi phương thức
“getClass()”
21 AvoidBooleanArray Tránh sử dụng mảng các phần tử kiểu “bool” 22 AvoidEmptyLoops Tránh sử dụng các vòng lặp rỗng
23 AvoidEmptyStaticInitializer Tránh sử dụng khối khởi tạo tĩnh rỗng 24 AvoidEmptyTryBlocks Tránh sử dụng khối “try” rỗng
25 AvoidEmptyFinallyBlock Tránh sử dụng khối “finally” rỗng 26 AvoidEmptyCatchBlocks Tránh sử dụng khối “catch” rỗng
27 AvoidEmptySynchronized- Tránh sử dụng khối “synchronized” rỗng Block
28 AvoidEmptyIf Tránh sử dụng câu điều kiện rỗng
29 AvoidUnnecessaryIf Câu điều kiện luôn hoặc không bao giờ xảy ra nên bị loại bỏ
30 AvoidWriteByteMethod- Tránh sử dụng “DataOutputStream.writeByte()”
InLoop trong vòng lặp
31 AvoidReadByteMethod-InLoo Tránh sử dụng “DataInputStream.readByte()” trong vòng lặp
32 AvoidMethodCallsInLoop Tránh gọi các phương thức trong vịng lặp nếu có thể
33 AvoidObjectInstantiation- Tránh khởi tạo các đối tuợng trong vòng lặp InLoops
34 PlaceTryCatchOutOfLoop Nên đặt “try/catch” ra bên ngồi vịng lặp nếu có thể
35 AvoidVectorElementAt- Tránh sử dụng “Vector.elementAt()” trong vịng
InsideLoop lặp
36 EnsureEfficientRemoval- Xóa các phần tử của “Collection” trong vịng lặp OfElementsInCollection một cách hiệu quả
37 EnsureEfficientRemoval- Xóa các phần tử của “Map” trong vịng lặp một OfMapEntries cách hiệu quả
STT Tên luật Mô tả
38 EnsureEfficientIteration- Duyệt qua các phần tử của “Map” một cách hiệu
OverMapEntries quả
39 UseEntrySetInsteadOf-KeySe Nên sử dụng “Map.entrySet()” thay cho “Map.keySet()”
40 AvoidPollingLoops Tránh sử dụng “Thread.sleep()” trong vòng lặp 41 AvoidUsingThreadYield Tránh sử dụng “Thread.yield()”
42 AvoidCreatingThread- Tránh khởi tạo “Thread” nếu khơng có đối tuợng WithoutRunMethod “implement” phương thức “run”
43 AvoidSynchronized- Tránh sử dụng các khối “synchronized” trong
BlocksInLoop vòng lặp
44 AvoidSynchronized- Tránh sử dụng các phương thức “synchronized” MethodsInLoop trong vòng lặp
45 AvoidSynchronized- Tránh sử dụng “synchronized” đối với một phương ModifierInMethod thức nếu có thể
46 AvoidLinkedList Tránh sử dụng “LinkedList” nếu có thể
47 DefineInitialCapacities Nên định truớc kích thuớc ban đầu của một “AbstractList”
48 UseToArrayWithArray- Sử dụng “Collection.toArray(Object[])” thay cho AsParameter “Collection.toArray()”
49 UseDataSourceInstead- Nên sử dụng “DataSource” thay cho OfDriverManager “DriverManager” để lấy đối tuợng “Connection”