To improve my programming style, I have been writing solutions for popular code katas. I have written a partial solution for the Berlin Clock kata and have been trying to follow the SOLID Principles. Can anyone critique the code and suggest improvements?
public class BerlinClock { private static List<TimeUnit> timeUnits = new ArrayList<TimeUnit>(); public static void main(String[] args) { timeUnits.add(new Second()); timeUnits.add(new Hour()); timeUnits.add(new Minute()); System.out.println(getTime("13:17:01")); } public static String getTime(String time) { StringBuilder timeSB = new StringBuilder(); String[] timeElements = time.split(":"); int i=0; int j=2; for(TimeUnit timeUnit : timeUnits){ for(String timeElement : timeElements){ timeSB.append(timeUnits.get(i).getLamps(Integer.parseInt(timeElements[j]))).append("\n"); i++; j--; break; } } return timeSB.toString(); } } TimeUnit
public interface TimeUnit { public String getLamps(int unit); } Hour
public class Hour implements TimeUnit { private static final String ALL_LIGHTS_OFF = "OOOO"; private static final String RED_LIGHT = "R"; private static final int MULTIPLE_OF_FIVE = 5; @Override public String getLamps(int hrs) { return getLampsForHoursMultiplesOfFive(hrs) + "\n" + getLampsForSingleHours(hrs); } public String getLampsForHoursMultiplesOfFive(int hours) { StringBuilder lamps = new StringBuilder(ALL_LIGHTS_OFF); for (int i = 0; i < (hours / MULTIPLE_OF_FIVE); i++) { lamps.replace(i, i + 1, RED_LIGHT); } return lamps.toString(); } public String getLampsForSingleHours(int hours) { StringBuilder lamps = new StringBuilder(ALL_LIGHTS_OFF); for (int i = 0; i < (hours % MULTIPLE_OF_FIVE); i++) { //dont do calculaion ever loop, do outside loop lamps.replace(i, i + 1, RED_LIGHT); } return lamps.toString(); } } Minute
public class Minute implements TimeUnit { private static final String RED_LIGHT = "R"; private static final String YELLOW_LIGHT = "Y"; private static final String ALL_FOUR_LIGHTS_OFF = "OOOO"; private static final String ALL_ELEVEN_LIGHTS_OFF = "OOOOOOOOOOO"; @Override public String getLamps(int minutes) { int minutesDividedBy5 = minutes / 5; int minutesModulus5 = minutes % 5; return getLampsForMinutesMultiplesOfFive(minutesDividedBy5) + "\n" + getLampsForSingleMinutes(minutesModulus5); } private String getLampsForMinutesMultiplesOfFive(int minutes) { StringBuilder lamps = new StringBuilder(ALL_ELEVEN_LIGHTS_OFF); for (int i = 0; i < minutes; i++) { if (0 == (i + 1) % 3) { lamps.replace(i, i + 1, RED_LIGHT); } else { lamps.replace(i, i + 1, YELLOW_LIGHT); } } return lamps.toString(); } private String getLampsForSingleMinutes(int minutes) { StringBuilder lamps = new StringBuilder(ALL_FOUR_LIGHTS_OFF); for (int i = 0; i < minutes; i++) { lamps.replace(i, i + 1, YELLOW_LIGHT); } return lamps.toString(); } } Second
public class Second implements TimeUnit { @Override public String getLamps(int seconds) { if (0 == seconds%2) { return "Y"; } return "O"; } }