Wątek przeniesiony 2016-09-06 18:39 z Newbie przez Patryk27.

Funkcja kwadratowa - prośba o ocenę skryptu

0

Napisałem sobie prosty skrypcik obiektowo w PHP dotyczący funkcji kwadratowej. Proszę o oceny i rady co poprawić/lepiej napisać oraz czy jest to napisane "zgodnie ze sztuką"?

<?php
	class F_Square{
		public $factor_a, $factor_b, $factor_c;
		public function deltaCalculation($factor_a, $factor_b, $factor_c){
			return $factor_b * $factor_b - 4 * $factor_a * $factor_c;
		}
		public function x1Cord($factor_a, $factor_b, $factor_c){
			return round(- ($factor_b - sqrt($factor_b * $factor_b - 4 * $factor_a * $factor_c)), 2) / 2 * $factor_a;
		}
		public function x2Cord($factor_a, $factor_b, $factor_c){
			return round(- ($factor_b + sqrt($factor_b * $factor_b - 4 * $factor_a * $factor_c)), 2) / 2 * $factor_a;
		}
		public function topCord1($factor_a, $factor_b){
			return round((-$factor_b) / (2 * $factor_a), 2);
		}
		public function topCord2($factor_a, $factor_b, $factor_c){
			return round(- ($factor_b * $factor_b - 4 * $factor_a * $factor_c), 2) / 4 * $factor_a;
		}
		public function deltaRadical($factor_a, $factor_b, $factor_c){
			return round(sqrt($factor_b * $factor_b - 4 * $factor_a * $factor_c), 2);
		}
	}
?>
<!DOCTYPE html>
<html>
	<head>
		<title>Square function</title>
	</head>
	<style>
		input { outline: none; }
		input:focus { border: 2px #f00 solid; }
		input.numeric { width: 40px;  height: 20px; }
		.error { background: #ffbaba; border: 1px #ff8585 solid; width: 100px auto; float: left; margin-top: 40px; margin-left: 560px; padding:10px; text-align: center; }
		.success { background: #dff2bf; border: 1px #cbea95 solid; width: 100px auto; float: left; margin-top: 40px; margin-left: 560px; padding: 10px; text-align: center; }
	</style>
	<body>
		<?php
			$ins = new F_Square();
			echo '
				<p style="text-decoration: underline; text-align: center">Square function generator(OOP):</p>
				<div style="border: 1px #444 solid; padding: 5px; width: 300px; margin: 0 auto">
					<form action="index.php" method="post">
						y = <input type="number" name="sendA" placeholder="a" class="numeric"/> x<sup>2</sup> +
						<input type="number" name="sendB" placeholder="b" class="numeric"/> x +
						<input type="number" name="sendC" placeholder="c" class="numeric"/> c
						<p style="float: right; margin: 10px"><button type="submit" name="calculateSquareFunction">Calculate</button></p>
					</form>
				</div>

			';
			if(isset($_POST['calculateSquareFunction'])){
				$delta = $ins->deltaCalculation($_POST['sendA'], $_POST['sendB'], $_POST['sendC']); 
				if($_POST['sendA'] == 0){
					echo '<p><div class="error">* "a" factor can not be 0!</div></p>';
				}else if($delta > 0){
					echo '<p style="text-decoration: underline"><div class="success">This function have 2 solutions.</p>
						  <p>&Delta; = b<sup>2</sup> - 4ac = '.$ins->deltaCalculation($_POST['sendA'], $_POST['sendB'], $_POST['sendC']).'</p>
						  <p>&radic;&Delta; = '.$ins->deltaRadical($_POST['sendA'], $_POST['sendB'], $_POST['sendC']).'</p>
						  <p>x<sub>1 = '.$ins->x1Cord($_POST['sendA'], $_POST['sendB'], $_POST['sendC']).'</sub></p>
						  <p>x<sub>2 = '.$ins->x2Cord($_POST['sendA'], $_POST['sendB'], $_POST['sendC']).'</sub></p>
						  <p>Top: W(p, q)</p>
						  <p>W('.$ins->topCord1($_POST['sendA'], $_POST['sendB'], $_POST['sendC']).', '.$ins->topCord2($_POST['sendA'], $_POST['sendB'], $_POST['sendC']).')</div></p>
					';
			
				}else if($delta == 0){
					echo '
						<p style="text-decoration: underline"><div class="success">This function have 1 solution.</p>
						<p>&Delta; = b<sup>2</sup> - 4ac = '.$_POST['sendB'].'<sup>2</sup>-4*'.$_POST['sendA'].' * '.$_POST['sendC'].' = '.$ins->deltaCalculation($_POST['sendA'], $_POST['sendB'], $_POST['sendC']).'</p>
						<p>&radic;&Delta; = '.$ins->deltaRadical($_POST['sendA'], $_POST['sendB'], $_POST['sendC']).'</p>
						<p>x<sub>0</sub> = '.$ins->topCord1($_POST['sendA'], $_POST['sendB']).'</p>
						<p>W('.$ins->topCord1($_POST['sendA'], $_POST['sendB']).', 0)</div></p>
					';
				}else if($delta < 0){
					echo '<p style="text-decoration: underline"><div class="error">This function haven`t solutions!</div></p>';
				}
			}
		?>
	</body>
</html>
1

[backend] Błędy w architekturze

  1. Metody w klasie F_Square powinny być statyczne, jako iż nie odnoszą się do jej pól (co także sugeruje, iż tak właściwie klasa w tym wypadku jest jedynie lukrem składniowym).
  2. Nazwa klasy F_Square nie mówi absolutnie nic, tak samo jak zresztą deltaCalculation czy jakakolwiek inna nazwa. Równie dobrze te metody mogłyby być ponumerowane, też by nic to nie znaczyło.
  3. W jakim celu istnieją pola factor_a, factor_b oraz factor_c i dlaczego są publiczne?
  4. Prawidłowe nazewnictwo pól to factorA, factorB oraz factorC, nie baw się w podkreślniki.

[backend] Niby nie błędy, ale źle postrzegane

  1. Nie wypluwaj kodu HTML przez echo - wykorzystaj szablony albo chociaż posłuż się wielokrotną konstrukcją <?php ... ?> (tagi te mogą być umieszczone w pliku wiele razy).
  2. Brak PHPDoców oraz jakichkolwiek innych opisów tego, co się tak właściwie dzieje. Przy czym uwaga, uwaga: o ile doctypy są powiedzmy 'wymagane', o tyle teoretyczna zajebiście napisana funkcja jest samo-komentująca, zatem dążymy do sytuacji, w której samo spojrzenie na kod wywoła efekt aha, wiem o co chodzi zamiast aha, to gdzie ja odłożyłem tę strzykawkę z heroiną.

[backend] Matematyka

Każde równanie kwadratowe ma dwa rozwiązania ;-) (choć czasem obydwa są tą samą liczbą) - Tobie zaś chodzi stricte o rozwiązania rzeczywiste, wtedy faktycznie przy ujemnej delcie następuje koniec obliczeń (lecz w programie nigdzie nie zaznaczasz, że rozwiązujesz wyłącznie w dziedzinie liczb rzeczywistych).

[backend] Język

W języku angielskim nie występuje takie określenie jak delta w tym kontekście. Jak to powiedział Sherlock: do your reserach.

[backend] Inne

Niemalże nigdy nie należy porównywać liczb zmiennoprzecinkowych bez epsilonu (fragment: if ($delta == 0)).

[backend-frontend] UI

Nie krzycz na użytkownika ("a" factor can not be 0!).

[frontend] Błędy

Brak doctype.

[frontend] Niby nie błędy, ale źle postrzegane

Nie wstawiaj CSS bezpośrednio do pliku HTML, linkuj pliki.

[frontend] Język

  1. This function haven't solutions! -> This equation has got no real solutions. (has, ponieważ function to liczba pojedyncza, a tak właściwie to nie function, tylko equation),
  2. can not -> cannot.

Moje podejście do problemu: http://ideone.com/pqMYgc (http://4programmers.net/Pastebin/5774)

Rzecz jasna mój kod można by jeszcze na co najmniej kilka sposobów poprawić (pierwszy strzał: zaimplementować walidację dla współczynnika a), lecz nie trzeba długo się przyglądać, aby dojść do wniosku, iż mimo to jest bardziej czytelny ;-)


Luźna rada: nie bój się zaglądać do słownika, sprawdzać każde słówko na Wikipedii oraz opracowaniach naukowych, ponieważ w innym wypadku wiecznie będziesz tworzył hinduskie kalki typu `deltaRadical`. Oprócz tego generalnie masz do rewizji swój język angielski - zapisz się na jakieś dodatkowe zajęcia or sometin'.
0

Koszmarne:

  • nie wiem co to robi,
  • nie mam ochoty zagłebiać się w kod w takiej formie.

Rzeczy, które od razu wrzucają sie w oczy:

  • Tragiczne formatowanie kodu,
  • Niespójny styl - jaką stosujesz konwencję nazewniczą? Każdą?
  • metody są czystymi funkcjami swoich argumentów, tworzony "obiekt" nie ma żadnego stanu - powinny to być wszystko statici albo w ogóle funkcje w namespace (czyli typowej obiektówki tu w ogóle nie ma - co samo w sobie niekoniecznie jest wadą, ale jak mówię - czuję ból jak próbuję przeczytać co to robi).
  • Mieszasz php z html - tak się "zgodnie ze sztuką" nie robi.

Polecam zapoznać się z: http://www.php-fig.org/psr/ tak na początek (chociaż PSR-1 i PSR-2).

0

Dzięki za rady i podpowiedzi. Jednak coś nie jest dla mnie niejasne w tym co napisałeś.

W jakim celu istnieją pola factor_a, factor_b oraz factor_c i dlaczego są publiczne?

A czy da się napisać to bez pól?

Nie wypluwaj kodu HTML przez echo - wykorzystaj szablony albo chociaż posłuż się wielokrotną konstrukcją <?php ... ?> (tagi te mogą być umieszczone w pliku wiele razy).

Nie bardzo rozumiem o co chodzi? Możesz pokazać jakiś mały przykład, nawet odnośnie mojego kodu?

Niemalże nigdy nie należy porównywać liczb zmiennoprzecinkowych bez epsilonu (fragment: if ($delta == 0)).

Również co wyżej, możesz pokazać przykład?

Brak doctype.

Jest:

<!DOCTYPE html>
0

A czy da się napisać to bez pól?
Pokaz mi, gdzie w swoim kodzie w ogóle wykorzystujesz te pola ;-)

Nie bardzo rozumiem o co chodzi? Możesz pokazać jakiś mały przykład, nawet odnośnie mojego kodu?

<?php
$costam = 'world';
?>

<p>
  Hello <?= $costam ?>!
</p>

Również co wyżej, możesz pokazać przykład?
Wykaż się jakąś inicjatywą i wpisz se w internet comparing float numbers.

Ad doctype: fakt, przeoczyłem to.

0

Pokaz mi, gdzie w swoim kodzie w ogóle wykorzystujesz te pola ;-)

No to bardzo dobre pytanie.

Dzięki za podpowiedzi. Postaram się poprawić kod i zamieszczę do dalszej oceny(poprawy). Ale wydaje mi się, że moje obiektowe kody jeszcze przez jakiś czas będą wynikać z zasady, że "jeśli coś jest głupie i działa to znacz, że nie jest takie głupie" :D

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