Contents. 1. PMD ㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍ 2. Metrics ㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍ 3. FindBugs ㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍ 4. ㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍ

Similar documents
PowerPoint 프레젠테이션

PowerPoint 프레젠테이션

Contents Contents 2 1 Abstract 3 2 Infer Checkers Eradicate Infer....

Microsoft PowerPoint - 14주차 강의자료

PowerPoint Presentation

PowerPoint 프레젠테이션

05-class.key

자바 프로그래밍

Modern Javascript

03장.스택.key

Design Issues

Microsoft PowerPoint - 04-UDP Programming.ppt

PowerPoint Presentation

5장.key

(8) getpi() 함수는정적함수이므로 main() 에서호출할수있다. (9) class Circle private double radius; static final double PI= ; // PI 이름으로 로초기화된정적상수 public

비긴쿡-자바 00앞부속

C프로-3장c03逞풚

02 C h a p t e r Java

쉽게 풀어쓴 C 프로그래밊

example code are examined in this stage The low pressure pressurizer reactor trip module of the Plant Protection System was programmed as subject for

rmi_박준용_final.PDF

chap10.PDF

<4D F736F F F696E74202D20C1A63038C0E520C5ACB7A1BDBABFCD20B0B4C3BC4928B0ADC0C729205BC8A3C8AF20B8F0B5E55D>

자바로

Microsoft PowerPoint - Java7.pptx

JMF3_심빈구.PDF

q 이장에서다룰내용 1 객체지향프로그래밍의이해 2 객체지향언어 : 자바 2

Microsoft PowerPoint - java1-lab5-ImageProcessorTestOOP.pptx

K&R2 Reference Manual 번역본

1

PowerPoint Presentation

쉽게 풀어쓴 C 프로그래밍

(Microsoft PowerPoint - 07\300\345.ppt [\310\243\310\257 \270\360\265\345])

Spring Boot/JDBC JdbcTemplate/CRUD 예제

gnu-lee-oop-kor-lec06-3-chap7

Java ...

자바GUI실전프로그래밍2_장대원.PDF

슬라이드 1

Microsoft Word - java19-1-midterm-answer.doc

gnu-lee-oop-kor-lec10-1-chap10

Chap12

JMF2_심빈구.PDF

untitled

PowerPoint Presentation

8 장데이터베이스 8.1 기본개념 - 데이터베이스 : 데이터를조직적으로구조화한집합 (cf. 엑셀파일 ) - 테이블 : 데이터의기록형식 (cf. 엑셀시트의첫줄 ) - 필드 : 같은종류의데이터 (cf. 엑셀시트의각칸 ) - 레코드 : 데이터내용 (cf. 엑셀시트의한줄 )

PowerPoint Presentation

Microsoft PowerPoint 장강의노트.ppt

어댑터뷰

쉽게 풀어쓴 C 프로그래밍

PowerPoint 프레젠테이션

Microsoft PowerPoint - Chapter 6.ppt

MPLAB C18 C

Microsoft PowerPoint - 2강

신림프로그래머_클린코드.key

adfasdfasfdasfasfadf

JAVA PROGRAMMING 실습 05. 객체의 활용

슬라이드 1

C++ Programming

PowerPoint Presentation

@OneToOne(cascade = = "addr_id") private Addr addr; public Emp(String ename, Addr addr) { this.ename = ename; this.a

JAVA PROGRAMMING 실습 02. 표준 입출력

Ç¥Áö

슬라이드 1

C# Programming Guide - Types

유니티 변수-함수.key

예제 2) Test.java class A intvar= 10; void method() class B extends A intvar= 20; 1"); void method() 2"); void method1() public class Test 3"); args) A

fundamentalOfCommandPattern_calmglow_pattern_jstorm_1.0_f…

Microsoft PowerPoint - additional01.ppt [호환 모드]

프로그램을 학교 등지에서 조금이라도 배운 사람들을 위한 프로그래밍 노트 입니다. 저 역시 그 사람들 중 하나 입니다. 중고등학교 시절 학교 도서관, 새로 생긴 시립 도서관 등을 다니며 책을 보 고 정리하며 어느정도 독학으르 공부하긴 했지만, 자주 안하다 보면 금방 잊어

제11장 프로세스와 쓰레드

<4D F736F F F696E74202D2036C0CFC2B05FB0B4C3BCC1F6C7E2C7C1B7CEB1D7B7A1B9D62E707074>

(Microsoft Word - \301\337\260\243\260\355\273\347.docx)

class Sale void makelineitem(productspecification* spec, int qty) SalesLineItem* sl = new SalesLineItem(spec, qty); ; 2. 아래의액티비티다이어그램을보고 Java 또는 C ++,

PowerPoint 프레젠테이션

Microsoft PowerPoint - C++ 5 .pptx

C++ Programming

쉽게 풀어쓴 C 프로그래밍

13주-14주proc.PDF

Connection 8 22 UniSQLConnection / / 9 3 UniSQL OID SET

UI TASK & KEY EVENT

Microsoft PowerPoint 자바-기본문법(Ch2).pptx

Microsoft PowerPoint - ÀÚ¹Ù08Àå-1.ppt

4. #include <stdio.h> #include <stdlib.h> int main() { functiona(); } void functiona() { printf("hihi\n"); } warning: conflicting types for functiona

untitled

Microsoft PowerPoint - lec2.ppt

교육자료

C++ Programming

제8장 자바 GUI 프로그래밍 II

Microsoft PowerPoint - additional06.ppt [호환 모드]

슬라이드 1

Analytics > Log & Crash Search > Unity ios SDK [Deprecated] Log & Crash Unity ios SDK. TOAST SDK. Log & Crash Unity SDK Log & Crash Search. Log & Cras

Spring Data JPA Many To Many 양방향 관계 예제

PowerPoint 프레젠테이션

10.0pt1height.7depth.3width±â10.0pt1height.7depth.3widthÃÊ10.0pt1height.7depth.3widthÅë10.0pt1height.7depth.3width°è10.0pt1height.7depth.3widthÇÁ10.0pt1height.7depth.3width·Î10.0pt1height.7depth.3width±×10.0pt1height.7depth.3width·¡10.0pt1height.7depth.3width¹Ö pt1height.7depth.3widthŬ10.0pt1height.7depth.3width·¡10.0pt1height.7depth.3width½º, 10.0pt1height.7depth.3width°´10.0pt1height.7depth.3widthü, 10.0pt1height.7depth.3widthº¯10.0pt1height.7depth.3width¼ö, 10.0pt1height.7depth.3width¸Þ10.0pt1height.7depth.3width¼Ò10.0pt1height.7depth.3widthµå

chap x: G입력

01-OOPConcepts(2).PDF

PowerPoint Presentation

API 매뉴얼

0. 표지에이름과학번을적으시오. (6) 1. 변수 x, y 가 integer type 이라가정하고다음빈칸에 x 와 y 의계산결과값을적으시오. (5) x = (3 + 7) * 6; x = 60 x = (12 + 6) / 2 * 3; x = 27 x = 3 * (8 / 4

Transcription:

<Software Modeling & Analysis> 정적분석서 - 영단어수집왕 - Team.# 3 과목명 소프트웨어모델링및분석 담당교수 유준범교수님 201011320 김용현 팀원 201111360 손준익 201111347 김태호 제출일자 2015-06-09 1

Contents. 1. PMD ㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍ 2. Metrics ㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍ 3. FindBugs ㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍ 4. ㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍ 2

1. PMD PMD AddEmptyString Database.java 빈공백문자추가하는부분삭제 - Database.java String sql = "select * from Word where key = "+randomword; PMD AvoidFieldNameMatchingTypeName Alphabet.java Class 이름과동일한변수이름사용부분수정 - Alphabet.java private char name; public char getname(); public void setname(char name); PMD AvoidInstantiatingObjectsInLoops Database.java Database 검색결과가여럿일수있기때문에그때마다새로운객체를생성하여 Vector 에추가하는것이맞다. 따라서코드를수정하지않았다. PMD EmptyIfStmt DictionaryPanel.java, SoundPlayer.java 비어있는조건문삭제 -DictionaryPanel.java if ((!(a.equalsignorecase(""))) && (!(a.equalsignorecase("123")))) 비어있던조건문을! 연산과 && 연산으로하나로합쳐수정하였다. -SoundPlayer.java public void display(string msg) { 내부에불필요한분기문삭제. Library 사용을위해빈 Method 로수정하였다. 3

PMD EmptyStatementNotInLoop SoundPlayer.java SoundPlayer 의비어있는조건문표기에서 ; 을사용하였던부분을삭제하였다. -SoundPlayer.java public void display(string msg) { 내부에불필요한분기문삭제. Library 사용을위해빈 Method 로수정하였다. PMD ExcessiveMethodLength DictionaryPanel.java, PicturePanel.java 가독성을늘리기위해코드가화면바깥으로나갈경우를대비해엔터를많이사용하여코드가길어졌다. 위두클래스에는레이아웃을설정하는코드가있어서내용이길어졌다. Method 내에기능이많은것이아니므로, 코드를수정하지않았다. 4

2. Metrics Metrics Number of Parameters AlphabetBoard.java Constructor 에 parameter 를 8 개전달했던부분을 Init Method(parameter 4 개 ) 와 Constructor(Parameter 3 개 ) 로나누어인수가지나치게많은것을줄였다. public AlphabetBoard (MainFrame frame, MainController maincontrol, GamePanel panel) public void init (int width, int wordwidth, int dx, int dy, int index) Metrics MaCabe Cyclomatic Complexity Board.java cycle method 에서 if 문과논리연산의개수가총 15 개였다. 7 개, 5 개 3 개로나누었다. if (x > dx && y > dy) { flag = 0; else if (x > dx && y < dy) { flag = 1; else if (x < dx && y > dy) { flag = 2; else { flag = 3; switch(flag) { case 0: x--; y--; case 1: x--; y++; case 2: x++; y--; case 3: x++; y++; default: if (x == dx y == dy) return false else return true 5

Metrics Nested Block Depth MainFrame.java MainFrame GameEvent(Event e) Method 내부에인접한 Block 의 Depth 가 total 6 의수치를가지던것을 4 로줄였다. int wordindex = maincontrol.getgamecontroller().getwordindex(); if(maincontrol.getgamecontroller().getword().get Name().charAt(wordIndex) == c maincontrol.getgamecontroller().getword().getna me().charat(wordindex) == (c + 32)) 6

3. FindBugs FindBug SS_SHOULD_BE_STATIC AlphabetBoard.java, Board.java 상수표현을 static 으로지정하였다. - AlphabetBoard.java private static final int DELAY = 2; - Board.java protected static final int B_WIDTH = 350; protected static final int B_HEIGHT = 350; protected static final int DELAY = 8; FindBug SQL_NONCONSTANT_STRING_PASSED Database.java sql 문에사용되는 String 을 Constant 로지정하였다. - Database.java String sql = "update Word set correct = 1 where name = '"; sql = sql.concat(word.getname()); sql = sql.concat("'"); String sql = "update Picture set URL = '"; sql=sql.concat(p.getimageurl()); sql=sql.concat("' where name ='reward'"); String sql = "select * from Word where name = '"; sql = sql.concat(usertypedword); sql = sql.concat("'"); 7

FindBug SF_SWITCH_NO_DEFAULT AlphabetBoard.java Board.java DictionaryPanel.java switch 문에 Default case 를추가하였다. - AlphabetBoard.java switch(result) { case 0: this.x = (int)((double)math.random() * ((double)this.width-(70*ratio))); case 1: this.x = (int)((double)math.random() * ((double)this.width-(70*ratio))); this.x = this.x+ this.width+this.wordwidth; default: - Board.java switch (maincontrol.getgamecontroller().getword().gettype()){ case 1: dx = width / 2 - width / 4-150; dy = height / 2 - height / 4-150; case 2: dx = width / 2 + width / 4-150; dy = height / 2 - height / 4-150; case 3: dx = width / 2 - width / 4-150; dy = height / 2 + height / 4-150; case 4: dx = width / 2 + width / 4-150; dy = height / 2 + height / 4-150; default: -DictionaryPanel.java switch (maincontrol.getdictionarycontroller().getdictionary().getwordarr().elementat(i).gettype()) - default case 추가 8

FindBug DLS_DEAD_LOCAL_STORE MainController.java, DictionaryPanel.java - MainController.java main 함수에서 Frame 호출이므로값을할당한후사용하지않는다. 코드수정을하지않았다. - DictionaryPanel.java new String() 삭제로객체생성을하지않는다. - DictionaryPanel.java String a; FindBug UCF_USELESS_CONTROL_FLOW SoundPlayer.java 불필요한분기문을삭제하였다. - SoundPlayer.java public void display(string msg) { 내부에불필요한분기문삭제. Library 사용을위해빈 Method 로수정하였다. 9

4. ClassDataAbstractionCouplingCheck DictionaryPanel.java, MainFrame, PicturePanel.java KeyListener, KeyAdapter, Runnable 등 Swing Library 를사용하는데있어직접수정하여사용하지않았다. 해당하는부분에서만사용하므로따로변수를만들어활용하지않았다. CyclomaticComplexityCheck Board.java cycle method 에서 if 문과논리연산의개수가총 15 개였다. 7 개, 5 개 3 개로나누었다. if (x > dx && y > dy) { flag = 0; else if (x > dx && y < dy) { flag = 1; else if (x < dx && y > dy) { flag = 2; else { flag = 3; switch(flag) { case 0: x--; y--; case 1: x--; y++; case 2: x++; y--; case 3: x++; y++; default: if (x == dx y == dy) return false else return true 10

EmptyLineSeparatorCheck 모든 Class 라인수가늘어나고, 가독성이더불편해진다고판단하여코드를수정하지않았다. FileTabCharacterCheck Contents Class 를제외한모든 Class 가독성에문제가없다고판단하여코드를수정하지않았다. JavaNCSSCheck DictionaryPanel.java, PicturePanel.java 가독성을늘리기위해코드가화면바깥으로나갈경우를대비해엔터를많이사용하여코드가길어졌다. 위두클래스에는레이아웃을설정하는코드가있어서내용이길어졌다. Method 내에기능이많은것이아니므로, 코드를수정하지않았다. LocalVariableNameCheck DictionaryPanel.java 코드를수정하였다. - DictionaryPanel.java ImageIcon wordicon = new ImageIcon (maincontrol.getdictionarycontroller().getword().getimageurl().replace(".gif", ".jpg")); int animalcount = 0; int plantcount = 0; int toolcount = 0; int nationcount = 0; 위 Local Variable 을사용하던곳에이름을변경하였다. 11

MemberNameCheck AlphabetBoard.java, Board.java, Contents.java, DictionaryPanel.java, GamePanel.java AlphabetBoard 와 Board 는상수를대문자로표현한것이어서코드를수정하지않았고, 나머지클래스의코드를수정하였다. - Contents.java private String soundurl; private String imageurl; - DictionaryPanel.java private TextField searchtextfield; - GamePanel.java int wordlength; int alphabetposx[] = new int[10]; int alphabetposy[] = new int[10]; int alphabetnow; int keyboardwidth; int keyboardheight; private JPanel rewardpanel; 위 Member Variable 을사용하던곳에이름을변경하였다. SeparatorWrapCheck Board.java, DictionaryPanel.java, GamePanel.java, PicturePanel.java 코드작성시줄이너무길어져서화면을벗어나는경우보다다음줄로내려서보이는것이가독성에있어서더좋다고판단하여코드를변경하지않았다. WhitespaceAfterCheck Database.java, AlphabetBoard.java, MainFrame.java 가독성에문제가없다고판단하여코드를변경하지않았다. WhitespaceAroundCheck DictionaryController.java, MainController.java, PictureController.java, Alphabet.java Database.java, Picture.java, Word.java, AlphabetBoard.java 가독성에문제가없다고판단하여코드를변경하지않았다. 12