fibAlyzer1.0.php - Ist es nun ein Fibonacci oder doch nicht??!

11/14/2014 22:23 SHA256#1
Guten Abend.
Hier release ich den fibAlyzer 1.0...

Die PHP Klasse analysiert einen Komma unterteilten string mit zahlen, und berechnet daraus, ob es sich um eine Fibonacci Zahlenfolge handelt.

Eigentliches Ziel der Arbeit war es, mehrere Mathematische arten von Zahlwiederholungen zu analysieren, möchte es gerne auch erweitern, muss aber noch googlen es noch so gibt.(Vll kennt von euch wer eine?). Sodass , sollte es keine Fibonacci sein, automatisch überprüft wird, ob's vielleicht eine andere Logisch begründbare ist..

Vielleicht lernt der eine oder andere was daraus, hab alles schön kommentiert^^
das ganze ist Objektorientiert.. einfach zu implementieren und zu erweitern

Hier der code:

1.0.1 [Only registered and activated users can see links. Click Here To Register...]

1.0 [Only registered and activated users can see links. Click Here To Register...]
11/14/2014 22:41 snow#2
#moved
11/17/2014 20:26 supercracker13#3
Also ich interessiere mich sehr für Mathematik und finde es deshalb auch interessant. Hier ist eine Seite die ziemlich viele Zahlenfolgen umfasst. Kannst dir ja mal so ein paar spannende raussuchen.
Interessant wäre halt ein Code der nicht nach vorgefertigten Schemen sucht, sondern versucht eine Schema herauszufinden. Ich weis das ist nicht so leicht, aber wäre auch mal spannend so etwas zu schreiben.
11/19/2014 00:21 SHA256#4
Hey cool das du es interessant findest! Ich glaub du hast den link vergessen^^bitte post ihn doch mal =)

Ja, leider weiss ich nicht wie genau ich so einen Algorithmus zusammenstellen soll, aber ich möchte das auf jedenfalls mal probieren. Ich denk aber auch, das sowas nicht mit 10 Zahlen funktioniert sondern mit 100 oder 1000.

danke nochmal für dein Feedback und bitte um deinen link.
Mit freundlichen Grüßen
11/19/2014 19:34 supercracker13#5
Oh Tatsächlich. Hab das ganz vergessen.
Hier ist jetzt aber wirklich der Link ^^

[Only registered and activated users can see links. Click Here To Register...]
11/25/2014 01:01 dowhile#6
Welchen Sinn macht es dass calculator von alyzer erbt?
11/25/2014 14:12 SHA256#7
Also calculater ist für die Berechnungen selbst zuständig, also es ist sowas wie ein Taschenrechner, alyzer analysiert die Rückgabewerte und macht das mit der Benutzer ein/ausgabe. Somit ist das alles schön getrennt int übersichtlich.
11/25/2014 15:06 dowhile#8
Wenn du mehrere Zahlenreihen mit verschiedenen Analysern analysierst, die dann alle mit Calculate eine gemeinsame Schnittstelle haben, macht dein Code mehr Sinn (template method). Aber dann ist die Methode "fibonacci" irgendwie schlecht gewählt, oder? Weil bei dem Ansatz wäre die Vererbung gerade dazu da, den Analysier-Algorithmus auszutauschen, und dann ist die Fibonacci Folge nur ein Spezialfall.

Btw. du solltest die Methode fibonacci in alyzer noch als abstract deklarieren, denn sonst kommen IDEs damit nicht zurecht. Und beim Lesen ist es auch verwirrend, wenn auf einmal eine Methode aufgerufen wird, die in der Klasse gar nirgends deklariert wird.
11/25/2014 17:08 SHA256#9
Ich kann dir jetzt echt gar nicht folgen... Was meinst du mit gemeinsamer Schnittstelle? Was meinst du mit "Analysier-Algorithmus auszutauschen"

In wie fern kommen IDEs nicht damit zurecht?

Meinst du mit verwirrend den Methodenaufruf in alyzer auf line 46? Wenn ja - Ja okay, aber die Methode ist doch in der Kindklasse.

Mit freundlichen Grüßen
11/25/2014 21:19 dowhile#10
Angenommen, du möchtest später neben der Fibonacci Folge auch die Folge des unendlichen Kettenbruchs analysieren. Dann könntest du mit deinem Design mehrere Unterklassen von Calculator bilden, die jeweils eine andere Folge untersuchen (also Polymorphie), die aber alle durch die Methoden in Alyzer gleich angesprochen werden können. Hast du deswegen die Vererbung eingebaut?
Wenn ja, ist, finde ich, der Name "fibonacci" für die Methode, die du in den erbenden Klassen implementierst, aber schlecht gewählt, weil sie sich dann nicht auf einen speziellen Algorithmus bezieht, zumindest nicht aus Sicht von Calculator.
Wenn das nicht deine Absicht war, verstehe ich dich nicht: Wieso ist es übersichtlicher, wenn ich das in zwei Klassen aufteilen, wenn es für Klassen, die deinen Code nutzen, ohnehin keinen Unterschied macht?

Beim zweiten meinte ich diesen Aufruf, ja. In anderen Sprachen geht das nicht, was du machst, denn dort würdest du eine undefinierte Methode aufrufen. In Alyzer gibt es nämlich in deinem Code kein "fibonacci()". In Calculator schon, das stimmt; wenn du aber nur Alyzer betrachtest, besteht kein Bezug zu irgendeiner erbenden Klasse.

Angenommen, du schreibst: new alyzer()->calcMap(); Das wäre ein Fehler, da fibonacci nirgendwo definiert wird (und in anderen Sprachen wäre das schon beim Kompilieren ein Fehler). Dass es ein fibonacci() in deinem alyzer Objekt gibt, wird erst zur Laufzeit bekannt, nämlich wenn du eben ein calculator Objekt anstatt direkt ein alyzer Objekt erstellt. IDEs führen den Code aber nicht aus, und deswegen haben die keine Ahnung, welche Methoden erst zur Laufzeit bekannt sein werden. Zudem ist dein Code so fehleranfällig, denn ein weiterer Entwickler übersieht leicht, dass er eine Methode implementieren muss, wenn er von alyzer erbt (und ebenso sieht er nicht direkt, dass keine Objekte direkt von alyzer angelegt werden dürfen).

Um das zu lösen, gibt es abstrakte Methoden/Klassen: Du kannst auch in PHP die Methode fibonacci() in alyzer als abstract deklarieren:

protected abstract function fibonacci();

Damit schaffst du eine Vorschrift für erbende Klassen, dass diese diese Methode implementieren müssen (oder deren Kinder). Zudem weiß so die IDE, ohne den Code auszuführen, dass diese Methode auf jeden Fall vorhanden sein wird, und wenn direkt ein Objekt von alyzer angelegt wird, ist auch direkt ersichtlich, dass das nicht erlaubt ist.
Abstrakte Methoden sind im Grunde das selbe wie die Deklarationen in einer Schnittstelle, nur in einer abstrakten Klasse.
11/25/2014 22:56 SHA256#11
Ahhh. Das mit der abstrakten Klasse hört sich sehr gut an. Aber ich kann auf Methoden der abstrakten Klasse zugreifen oder?
Eine Abstrakte Klasse ist also wie eine Schnittstelle oder so wie eine api, wo ich Methoden in der implementierenden Klasse definieren kann, um dann die rückgabewerte der Methode in der implementierenden Klasse auswerten kann oder? Hab ich das richtig verstanden?

Wenn ja definieren ich jetzt alayzer als abstrakt und den fibonacci ebenso darin.

erweitere alayzer um calculator und das wars doch auch schon oder? Zeile 46 ändere ich einfach in calculator::fibonacci()?
11/26/2014 16:42 dowhile#12
Ja, ich glaube du sagst das richtige. Ein Beispiel vielleicht noch:

Code:
abstract class Parent {

  public function say() { echo "Hello, " . $this->getName(); }

  protected abstract function getName();
}

class ChildMax extends Parent {

  protected function getName() { return "Max"; }
}

class ChildTom extends Parent {

  protected function getName() { return "Tom"; }
}

class ChildFoo extends Parent {} // Fehler: abstrakte Methode nicht implementiert

new ChildMax()->say(); // Max
new ChildTom()->say(); // Tom
new Parent() // Fehler: Klasse abstrakt
Deine Änderungen hören sich richtig an. Zeile 46 musst du aber nicht ändern, denn du kannst die abstrakte Methode trotzdem ganz normal aufrufen. calculator::fibonacci() wäre bei statischen Methoden richtig, oder? (und so eine hast du hier ja nicht)
11/26/2014 18:38 SHA256#13
Alles klar, hab den code nun umgeschrieben! und auch eine neue Methode eingebaut.
[Only registered and activated users can see links. Click Here To Register...]