moja implementacja do ocenki
Klasa **Main ** czyli:
główny
magistralny
najważniejszy
centralny
czołowy
pryncypalny
środkowy
Czyli klasa od programu który implementuje (...) nazywa oznacza "główny..".
Dalej jedziemy... Mamy klasę **Main ** - czyli główną, a w niej metodę main() **** - czyli główną metodę głównej klasy... - jak na razie brzmi sensownie, logicznie i nazwy mówią same za siebie o co kaman. A w metodzie main() mamy kod:
pies = new Main().decode(text, key);
czyli de facto nie tworzymy instancji (obiekt) tej klasy... ..yyyyy nieee, jednak tworzymy, a z tego co wyjdzie (obiekt) na nim wywołujemy metodę .decode(), która nam coś zwraca.
A może lepiej, czytelniej i tak aby się trzymało to kupy, zamiast tworzyć obiekt bez przypisywania go do zmiennej, napisać tak:
- Nazwać klasę **Main **-> Start (lub App). Będzie to klasa którą się aplikację uruchamia. W tej klasie będzie metoda main()
- Stworzyć klasę dodatkową CezarCipherImpl.java - że jak nazwa wskazuje tam jest implementacja szyfratora szyfru Cezar'a.
- Wewnątrz tej klasy stworzyć metodę m.in. decodeString(). Czyli metoda jak nazwa wskazuje koduje jakiegoś String'a którego przekażemu w argumencie.
Start.java {
import com.theBest.ciphers,CezarCipherImpl;
public static void main(String[] args) {
...
String plainText = "ala ma kota";
pies = CezarCipherImpl.decode( plainText, key);
...
}
CezarCipherImpl.java {
public static String decode(String plainText, int offset) {
...
}
}
Tutaj co ważne, metoda decode() jest statyczna. Czyli faktycznie nie potrzebujesz tworzyć obiektu z całej klasy CezarCipherImpl tylko po prostu używasz metody, której implementacja jest wewnątrz definicji klasy.
To samo tyczy się stałych zdefiniowanych w tej klasie:
public **static **final int NUMBER_OF_LETTERS_IN_ALPHABET = 'Z' - 'A' + 1;
public static final int END_OF_LETTERS_IN_ALPHABET = 'Z';
public **static **final int BEGINING_OF_LETTERS_IN_ALPHABET = 'A';
Poza tym tak jak przedmówca napisał - konwencje nazewnicze. Albo umawiamy się, że kodujemy w języku polskim, albo w angielskim bądź jeszcze innym. A jeżeli tak, to wszystko nazywamy w tym własnie języku.
Nie **dlugosc **i nie enc tylko **length **i enc. A samo enc również ... może jednak warto zastąpić plainText, który przynajmniej wiadomo co oznacza
Bo enc może oznaczać:
encrypted
encrypt
i diabli wiedzą co jeszcze. A każdy z tych wyrazów NIE oznacza "nie zaszyfrowanego tekstu" badź też "tekst jawny".
Konkatencja Stringów. Nie wiem czy wiesz, ale "dodawanie" (czyli łączenie) wartości łańcucha znaków w Javie nie przebiega tak różowo jak tobie się wydaje.
Odbywa się to na zasadzie kązdorazowego tworzenia nowego obiektu klasy String.
wynik += AAA + BBB
czyli:
wynik = wynik + AAA + BBB
wykonywany w pętli będzie powodował coś takiego:
wykonanie takiego pseudo kodu po kolei:
new String(AAA) + new String (BBB)
new String(AAABBB) + new String(AAABBB)
new String(AAABBBAAABBB)
String wynik = new String(AAABBBAAABBB)
Czyli w każdym przebiegu pętli 6 razy użwany jest konstruktor z klasy String, który tworzy nowy obiekt.
Z kolei ta pętla wywoływana jest u ciebie w ilości: 6 * ilość znaków w tekście jawnym. Czyli... dużo. A to jest tylko jedna linijka kodu pętli.
A więc tak jak przedmówca napisał, zainteresuj się klasami StringBuffer i StringBuilder. Bo one własnie są do tego, aby wartości Stringów do siebie "dodawać".
Zainteresuj się obiema tymi klasami, a jak przeczytasz ich dokumentacje to jest tam wyjaśniona jaka jest między nimi różnica i dlaczego czasami używać warto jednej, a w innych przypadkach durgiej.
Tak na marginesie dodam, że jaka jest różnica między tymi klasami może pojawić się na rozmowie kawalifikacyjnej na junior developera. A przynajmniej dawniej takie pytania się pojawiały.
result += ((char) (dlugosc));
StringBuilder sb = new StringBuilder();
sb.append( (char) dlugosc ); // dlugosc -> someThingLength
return sb.toString(); // i tutaj akurat .toString() jest konieczna i ma rację bytu.
p.s.
A na koniec nieśmiało zapytam co oznacza bądź co ma oznaczać w kodzie zmienna pies? :D
pozdrawiam i idę spać, bo z rana do roboty....