Ocena kodu - szyfr cezara

0

Witam,
Napisałem ostatnio skrypt szyfrujący wiadomości szyfrem cezara a w ramach nauki OOP postanowiłem zrobić też wersję obiektową.
Nie jestem jednak pewien jak mi to wyszło i czy zachowałem wszystkie standardy PSR więc zwracam się o ocenę do społeczności forum :)
Kod:

<?php
class Cezar
{
	private $output = '';
	private $decode = '';
	
	public function cipher(string $code, int $key, string $operation, bool $uppercase = false)
	{
		for ($i = 0; $i < mb_strlen($code); $i++) {
			$letter[$i] = mb_substr($code, $i, 1);
			if (ctype_alnum($letter[$i]) == false) {
				$this->output .= $letter[$i];
				continue;
			}
			if ($operation == 'ENCRYPT' || $operation == 'encrypt') {
				$this->decode = ord($letter[$i]) + $key;
				for ($j = 0; $j <= 25; $j++)
					if ($this->decode == 123 + $j) $this->decode -= 26;
			}
			else if ($operation == 'DECRYPT' || $operation == 'decrypt') {
				$this->decode = ord($letter[$i]) - $key;
				for ($j = 0; $j <= 25; $j++)
					if ($this->decode == 96 - $j) $this->decode += 26;
			}
			$this->decode = chr($this->decode);
			if (ctype_upper(mb_substr($code, $i, 1))) $this->decode = strtoupper($this->decode);
			$this->output .= $this->decode;
		}
		if ($uppercase==true) $this->output = mb_strtoupper($this->output);
		return '<p>Result: ' . $this->output . '</p> Original text: ' . $code;
	}	
}

$cezar = new Cezar();
echo $cezar->cipher('To skrypt szyfrujacy wiadomosci szyfrem cezara zrobiony w PHP', 3, 'ENCRYPT', false);
3

To nie ma nic wspólnego z OOP, po prostu funkcja zamknięta w klasę.

Po co przechowywujesz w niej output i decode skoro i tak nie można tam się dostać w żaden sposób i sama klasa z tego nie korzysta? Dlaczego zwracasz tekst w języku angielskim, jak chce użyć Twojej klasy bez jej modyfikacji to do niczego mi się nie przyda - ew. będę musiał pisać kolejną klasę która obuduje Twoją klasę (jakiś dektorator) i zwróci normalną, pojedyńczą wartość.

Jak ktoś chce sobie zrobić uppercase na wyniku z tej "klasy" to przecież może użyć mb_strtoupper poza nią, takie komplikacje (w postaci dodatkowego argumentu) na siłę później prowadzą do zamieszania w większych projektach.

0

Właśnie tak myślałem, że coś za łatwo mi to poszło... Dopiero zaczynam z obiektówką i chciałem wykorzystać moją wiedzę w jakimś małym, prostym projekcie.
W takim razie jak to powinno mniej więcej wyglądać (chodzi mi o samą logikę lub jakiś link)

2

Zanim zabierzesz się za OOP to naucz się rozbijać kod na funkcje. Aż prosi się o zrobienie funkcji Code i Decode, może jakaś osobna metoda(może protected?) do "przesuwania", którą potem będzie można korzystać w Code i Decode. O tym, żeby zwracały czysty tekst to już ktoś wyżej nawet wspomniał.

0

Gdybym rozbił szyfrowanie i odszyfrowywanie na dwie funckje, to musiałbym kopiować pewną część kodu, a tak ifem sprawdzam w kilku linijkach jaki argument został podany.
Nie wiem dokładnie jakby to było z dziedziczeniem itd... ale ja jeszcze nie poznałem całego OOP i po prostu nie wiem jak powinno się niektóre rzeczy robić. W książce, którą czytam (PHP7 autorstwa Marcina Lisa) był taki miniprojekt - obiektowa lista odwiedzin i działała na podobnej zasadzie (i to po poznaniu dopiero kilku zagadnień w tym języku) przez co pomyślałem, że mogę też napisać taką obiektową wersję mojego skryptu. Chyba jednak będę musiał obejrzeć albo przeczytać jakiś porządny kurs obiektówki PHP w praktyce, bo widzę że to nie poszło mi najlepiej ;)

0
enterbox napisał(a):

Gdybym rozbił szyfrowanie i odszyfrowywanie na dwie funckje, to musiałbym kopiować pewną część kodu, a tak ifem sprawdzam w kilku linijkach jaki argument został podany.

Ale to właśnie idealnie pasuje pod wyodrębnienie osobnych metod :D

Z szyfrem Cezara może być problem, żeby jakoś użyć w nim większych możliwości OOP. Może lepszą bazą do nauki byłyby figury?

1 użytkowników online, w tym zalogowanych: 0, gości: 1