Details
-
Type:
Code Smell Detection
-
Status: Active
-
Resolution: Unresolved
-
Labels:
-
Message:Refactor this code to load this text as an external resource.
-
Highlighting:
-
Default Severity:Major
-
Impact:Low
-
Likelihood:High
-
Targeted languages:Java
-
Remediation Function:Constant/Issue
-
Constant Cost:30min
-
Analysis Scope:Main Sources, Test Sources
Description
It is not uncommon, for instance when dealing with SQL requests, to have repeated calls to StringBuilder.append() to create a long (sometimes really long) String that will be then passed to the appropriate subsystem (e.g. jdbc.Statement()). This is very undesirable because it makes it more difficult to read, and maintain, the statement in the String due to overlapping syntaxes.
It is highly recommended to address such a case with an external text file loaded as a resource.
Noncompliant Code Example
sb = new StringBuilder() .append("SELECT CASE ") .append("WHEN year = 'FR' THEN 'FR'") .append("WHEN year = 'SO' THEN 'SO'") .append("WHEN year = 'JR' THEN 'JR'") .append("WHEN year = 'SR' THEN 'SR'") .append("ELSE 'No Year Data' END AS year_group,") .append("COUNT(1) AS count") .append("FROM benn.college_football_players") .append("GROUP BY CASE WHEN year = 'FR' THEN 'FR'") .append("WHEN year = 'SO' THEN 'SO'") .append("WHEN year = 'JR' THEN 'JR'") .append("WHEN year = 'SR' THEN 'SR'") .append("ELSE 'No Year Data' END");
Compliant solution
InputStream inputStream = this.getClass().getResourceAsStream("MySQLRequest.txt");