2013-03-14 4 views
7

मैं गुणवत्ता के मुद्दों के लिए जागरूकता बढ़ाने के लिए हमारे जावा/जेएसपी वेब एप्लिकेशन (कोर्स की विरासत ;-) की विरासत) के बारे में प्रारंभिक, व्यापक स्थैतिक कोड विश्लेषण रिपोर्ट तैयार कर रहा हूं। मुख्य जावा कोड कोई समस्या नहीं है, वहां बहुत सारे मुफ्त टूल उपलब्ध हैं, उदा। पीएमडी, चेकस्टाइल, क्लाससाइकिल, आदिजेएसपी का सांख्यिकीय विश्लेषण करने के लिए किस उपकरण या प्रक्रिया का उपयोग करना है?

लेकिन जेएसपी के बारे में क्या? हमारे जेएसपी (दुर्भाग्य से) में एम्बेडेड काफी जावा कोड है और इसका विश्लेषण किया जाना चाहिए। मैं कौन से टूल्स का उपयोग कर सकता हूं या जेएसपी का सांख्यिकीय विश्लेषण करने के लिए मुझे किस प्रक्रिया का पालन करने की आवश्यकता है?

  • मैं PMD 5 के नए JSPs कवर कार्यक्षमता के बारे में पता है, यह पता लगाने के लिए worthwile है?
  • मैं किसी भी तरह से जेएसपी के स्रोत सर्वलेट उत्पन्न कर सकता हूं और मूल जावा विश्लेषण उपकरण का उपयोग कर सकता हूं, यदि ऐसा है तो जेएसपी के लिए जावा स्रोत प्राप्त करने का सबसे आसान तरीका क्या है?

उत्तर

3

के रूप में हेनरी सही ढंग से बताया में एक जवाब, यह एक अच्छा मीट्रिक के लिए आर जेएसपी "लाइन स्क्रिप्टलेट कोड की संख्या" है। यह कुछ नियमित अभिव्यक्तियों के साथ किया जा सकता है।

मैं बनाम लाइनों एचटीएमएल (=LoC_Java/LoC_Html) कोड की लाइनों के अनुपात पाया सबसे अर्थपूर्ण होने के लिए: छोटे इस संख्या है, बेहतर है।20 या 30% तक के अनुपात ठीक दिखते हैं, लेकिन 50% से ऊपर या यहां तक ​​कि 1>खराब हैं। मेरे विश्लेषण में मैंने 6 (वास्तव में खराब) अनुपात के साथ जेएसपी पाया।

पृष्ठ निर्देशों की संख्या भी किसी न किसी अंतर्दृष्टि प्रदान करती है। चूंकि यह संख्या मुख्य रूप से आयात के कारण होती है, इसलिए उच्च संख्या उच्च युग्मन दर्शाती है।

इसी तरह के मीट्रिक PMD में उपलब्ध हैं जो JSP Ruleset है। यह HTML पृष्ठ विश्लेषण पर आधारित है और स्क्रिप्टलेट की संख्या, स्क्रिप्टलेट की लंबाई, डुप्लिकेट आयात और एन्कोडिंग समस्याओं के साथ-साथ सादे HTML विरोधी पैटर्न की रिपोर्ट करने में सक्षम है।

1

मैं कड़वा आवाज नहीं करना चाहता, लेकिन इससे बाहर निकलने की क्या कोशिश कर रहे हैं?

मुझे लगता है (और मैं गलत हो सकता हूं) कि जेएसपी पर कोड गुणवत्ता मेट्रिक्स प्राप्त करना वास्तव में उपयोगी नहीं है क्योंकि नींव वास्तव में एक बहुत ही खराब प्रथा है।

व्यक्तिगत रूप से, मैं किसी भी संसाधन या समय को जेएसपी से एमवीसी या डीसीआई ढांचे में माइग्रेट करने के तरीके को जानने के लिए निवेश करने का प्रयास करता हूं।

+0

पूछने के लिए Ty। यह एक बड़ी परियोजना है और मैं नया हूं। 500+ जेएसपी हैं और मैं उनमें से प्रत्येक को नहीं देख सकता। मैंने कुछ तर्क मिश्रित के साथ देखा, लेकिन एक आकलन की आवश्यकता है कि समस्या कितनी खराब/व्यापक है। इसके आधार पर हम इसे ठीक करने पर काम कर सकते हैं (या शायद अन्यथा फिक्सिंग कर सकते हैं, क्योंकि बहुत सारे विकल्प हैं ;-) –

0

ईमानदारी से इस विश्लेषण (यदि संभव हो) बोलने से आपको कुछ भी नहीं मिलेगा। जेएसपी के अंदर मिश्रित कोड बस बेकार है। केवल समाधान ही कम से कम एक सेवा वर्ग में स्थानांतरित करना है, यदि प्रारंभ में किसी भी एमवीसी ढांचे में माइग्रेट करना संभव नहीं है। बाद में उन सेवा वर्ग का पुन: उपयोग और अधिक आसानी से विश्लेषण किया जा सकता है। एक दर्दनाक jsp कोड की

उदाहरण मैं हाल ही में काम: प्रणाली 9 साल पुराना है

oListCode.setDB(driverclass, databaseurl, databasetype.intValue()); 
java.util.Vector oVecActiveStatusListCodes = oListCode.getListCodes(13, user.getAdminId()); 


java.text.DecimalFormat dformat = new java.text.DecimalFormat("###0.00"); 
java.text.DecimalFormat averageformat = new java.text.DecimalFormat("###0.##"); 

java.util.Vector userDirectoryVector = new java.util.Vector(); 

String searchoptionvalue = request.getParameter("iscombinesearch"); 
if (searchoptionvalue != null && searchoptionvalue.equals("on")) { 
    java.util.Vector oVectorStudents = (java.util.Vector) session.getAttribute("studentsearchresult"); 

    if (oVectorStudents != null) { 
     oVector.addAll(oVectorStudents); 
    } 
} 


java.util.Vector<StatusSequenceInfo> oStaSeqVector = student.getStatusSequence(user.getAdminId()); 
java.util.Vector<StatusSequenceInfo> oEnrollStatusvecto = student.getProgramStatus(user.getAdminId()); 


String parameterList = "?columns=" + java.net.URLEncoder.encode(columns, "UTF-8") + 
        "&activestatus=" + activestatus + 
        "&studenttype=" + studenttype + 
        "&faith=" + faith + 
        "&race=" + race + 
        "&levelid=" + levelid + 
        "&levelidlist=" + levelidlist + 
        "&curriculumid=" + curriculumid + 
        "&programmeid=" + programmeid + 
        "&programmelevelid=" + programmelevelid + 
        "&semesterid=" + semesterid + 
        "&sex=" + sex + 
        "&idnumber=" + java.net.URLEncoder.encode(idnumber, "UTF-8") + 
        "&batchnumber=" + java.net.URLEncoder.encode(batchnumber, "UTF-8") + 
        "&firstname=" + java.net.URLEncoder.encode(firstname, "UTF-8") + 
        "&middlename=" + java.net.URLEncoder.encode(middlename, "UTF-8") + 
        "&lastname=" + java.net.URLEncoder.encode(lastname, "UTF-8") + 
        "&nationality=" + java.net.URLEncoder.encode(nationality, "UTF-8") + 
        "&address=" + java.net.URLEncoder.encode(address, "UTF-8") + 
        "&city=" + java.net.URLEncoder.encode(city, "UTF-8") + 
        "&state=" + java.net.URLEncoder.encode(state, "UTF-8") + 
        "&zip=" + java.net.URLEncoder.encode(zip, "UTF-8") + 
        "&homephone=" + homephone + 
        "&email=" + email + 
        "&advisor=" + java.net.URLEncoder.encode(advisor, "UTF-8") + 
        "&dob=" + dob + 
        "&visaexpiredate=" + java.net.URLEncoder.encode(visaexpiredate, "UTF-8") + 
        "&regstatus=" + regStatus + 
        "&regstartDate=" + java.net.URLEncoder.encode(regstartDate, "UTF-8") + 
        "&regendDate=" + java.net.URLEncoder.encode(regendDate, "UTF-8") + 
        "&shashmap=" + shashmap + 
        "&studentcount=" + studentcount + extendedurl; 

String paginationLink = "admin_search_student_result.jsp" + parameterList; 
long totalpage = new Double(Math.ceil(new Double(studentcount).doubleValue()/number_of_student)).longValue();//for pagination 

String downloadStudentLink = "download_search_student_result.jsp" + parameterList + "&number_of_student=" + studentcount; 
String printStudentLink = "admin_print_search_student_result.jsp" + parameterList + "&from_row=" + from_row; 

%> 


<html <%if (user.getLanguageId()>0 && oDictionary.getLanguageInfo(user.getLanguageId()).getDirection()==1) out.print("dir='rtl'");%>> 

<head> 
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-15"/> 
<title><%if (user.getRole()==6) out.print(oDictionary.getTranslatedWord(userLanguageId, "Sub-Administrator", adminId)); else out.print(oDictionary.getTranslatedWord(userLanguageId, "Administrator", adminId));%></title> 
<meta name="GENERATOR" content="Microsoft FrontPage 5.0"> 
<meta name="ProgId" content="FrontPage.Editor.Document"> 
<meta name="Microsoft Theme" content="blocks 000, default"> 
<meta name="Microsoft Border" content="tlb, default"> 

</head> 


<body bgcolor="#FFFFFF" text="#000000" link="#CC0000" vlink="#CC0000" alink="#CC0000" leftmargin=5 topmargin=5 marginheight="0" marginwidth="0" onResize="if (navigator.family == 'nn4') window.location.reload()"> 


<p> 
<table width=100%> 
<td> 
<img src="images/search.gif"> <b><font color="#666666" face="Arial, Arial, Helvetica" size="5"><%=oDictionary.getTranslatedWord(userLanguageId, "Search Result", adminId)%> &nbsp;&nbsp;</font></b> 
</td> 
<td align=right> 
<table> 
<%if (user.getRole()==4 || (user.getRole()==6 && (user.getOptions().indexOf("[STUDENT_RECORDS=") != -1))) {%> 
<td> 
&nbsp;<img src="images/write.gif"> <font face=arial size=2 color="#666666"><b><a href="new_student.jsp"><%=oDictionary.getTranslatedWord(userLanguageId, "New Student", adminId)%></a></font></b> 
</td> 
<%} %> 
<td> 
&nbsp;<img src="images/search.gif"> <font face=arial size=2 color="#666666"><b><a href="admin_search_student.jsp"><%=oDictionary.getTranslatedWord(userLanguageId, "Search Student", adminId)%></a></font></b> 
</td> 
<td> 
&nbsp;<img src="images/read.gif"> <font face=arial size=2 color="#666666"><b><a href="students.jsp"><%=oDictionary.getTranslatedWord(userLanguageId, "Student Directory", adminId)%></a></font></b> 
</td> 
</table> 
</td> 
</table> 


<%if (user.getRole()==4 || (user.getRole()==6 && (user.getOptions().indexOf("[STUDENT_RECORDS=F]") != -1 || user.getOptions().indexOf("[STUDENT_RECORDS=V]") != -1))) {%> 

<table width="100%"> 
<tr> 
<td> 
    <%@ include file="paginate.jsp" %> 
</td> 

<td align="right"> 
<table> 
<tr> 
<td> 
<img src="images/download.jpg"> 
<a href="<%=downloadStudentLink%>" target=_><font face=arial size=-1>[<%=oDictionary.getTranslatedWord(userLanguageId, "Download search result", adminId)%>]</font></a> 
</td> 
<td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
<a href="<%=printStudentLink%>" target=_><img border=0 src="images/printer.gif"><font face=arial size=-1>[<%=oDictionary.getTranslatedWord(userLanguageId, "Print search result", adminId)%>]</font></a> 
</td> 
</tr> 
</table> 
</tr> 
</table> 

</font> 
<table border="0" cellpadding="1" cellspacing="0" style="border-collapse: collapse" width="100%" id="AutoNumber1" bordercolordark="#666666" bordercolorlight="#999999"> 

<%if (!columns.equals("")) {%> 

<tr> 
<td nowrap bgcolor="<%=user.getColor()%>" bordercolor="#CC3300"><font face="Arial, Arial, Helvetica" size=2><b><%=oDictionary.getTranslatedWord(userLanguageId, "Student Name", adminId)%></b></font></td> 
<%for (int i=0; i<oVectorColumns.size(); i++) {%> 
<td nowrap bgcolor="<%=user.getColor()%>" bordercolor="#CC3300"><font face="Arial, Arial, Helvetica" size=2><b><%=oVectorColumns.get(i)%></b></font></td> 
<%}%> 
</tr> 

<% 

    for (StudentInfo studentinfo:oVector) { 

     userDirectoryVector.add(new Long(studentinfo.getStudentId())); 

     java.util.HashMap oHashMapProfielValues = oExtendedProfile.getProfileFieldValues(studentinfo.getStudentId(), 1, user.getAdminId()); 
     java.util.Vector oVectorStudentAllPrograms = registration.getStudentAllProgrammes(studentinfo.getStudentId(), user.getAdminId()); 

     String programname = ""; 
     String levelname = ""; 
     String programlevelname = ""; 
     String RegistrationDate=""; 

तो, न यह इन बल्कि विश्लेषण करने को साफ करने के लिए बेहतर है? "इस scriptlets में क्या है JSP" या "लाइनों की संख्या कोड scriptlet" है, जो आपको चाहिए ग्रेप या कुछ इसी तरह के साथ साथ बुरा काम करने में सक्षम हो - जवाब है हां मुझे लगता है कि

+0

मैं सहमत हूं, संक्षिप्त उत्तर निश्चित रूप से हां है। लेकिन मैं सभी 500 जेएसपी को ठीक नहीं कर सकता, इसलिए टीम को मुख्य व्यवसाय के बगल में काम करना है और फिर प्रबंधन को समय देने के लिए इसे मंजूरी देनी है। मुझे इसे ठीक करने के लिए समय मांगने के लिए "केस बनाएं" की आवश्यकता है, मुझे कुछ संख्याओं की आवश्यकता है, जैसा कि वे हो सकते हैं। –

+0

आपके साथ सहमत हुए। परियोजना प्रबंधन दृश्य से थोड़ा कठिन स्थिति। – Forhad

3

एक बहुत ही सरल मीट्रिक उद्देश्य के लिए काम कर सकते हैं है।

यदि आप चीजों को ठीक करने के लिए समय के लिए प्रबंधन के लिए पिच बना रहे हैं तो क्या यह कोई मूल्य जोड़ देगा?

---- संपादित ----

एक त्वरित गूगल पता चलता है कि आप इस

http://www.semanticdesigns.com/Products/SearchEngine/

कौन सा रूप में सुझाव दिया गया था का उपयोग कर JSPs के लिए आँकड़े मैं ऊपर सुझाव को निकालने के लिए सक्षम हो सकता है इस सवाल का

What would be a good way to measure the size of a JSP project?

+0

+1 मैं यह एक बहुत अच्छा मीट्रिक है। जेएसपी में कोड की कोई भी पंक्ति कोड की एक खराब रेखा है :)। – Augusto

+0

और निर्देशों का संबंध <-> एलओसी लिखित <-> लोसी एचटीएमएल 'मुझे एक अच्छा अवलोकन देता है कि क्या हो रहा है: कई आयात/निर्भरता बनाम बहुत अधिक कोड बनाम पृष्ठ ठीक है। धन्यवाद। –

संबंधित मुद्दे