Parameter Problem

Status
Nicht offen für weitere Antworten.

Bit2_Gosu

Bekanntes Mitglied
Hi!

Ich habe eine abstrakte Klasse "Schachfigur", die von nicht abstrakten Klassen wie "König" "Bauer" usw. erweitert wird.
Nun schreibt die Klasse "Schachfigur" vor, dass jede abgeleitete Klasse eine Funktion implementiert, die ausgibt, wo die Figur überall hingehen könnte.
Mein Problem ist nun: Manche Klassen, wie zum Beispiel "Bauer" müssen den bisherigen Spielverlauf kennen, um die genannte Funktion implementieren zu können (wegen En-Passant), andere wiederum nicht. D.h. Manche brauchen in der Funktion einen zusätzlichen Parameter, andere nicht.
In der abstrakten Klasse muss ich ja nun aber entscheiden, wieviele Parameter die Funktion haben soll.

Was tun?
 

faetzminator

Gesperrter Benutzer
Immer alle Informationen übergeben. Wenn die Figur die Information benötigt, liest sie sie, ansonsten halt nicht.
 
S

Spacerat

Gast
Nun kenne ich die En-Passant-Regel nicht so genau, aber afaik kann ein Bauer diese nur ausspielen, wenn er sein Spiel nicht mit einem 2-Feld-Zug begonnen und diese Regel noch nicht angewendet hat. Das könnte man in der "makeMove()"-Methode (oder wie auch immer die heisst) durch ein boolean signalisieren. Im weiteren Verlauf des Spiels benötigt auch der Bauer nur noch alle freien Felder des Schachbretts, um daraus jene zu markieren (zurück zu geben) auf welche er gehen kann.
 

Marco13

Top Contributor
Bei En Passant ist's noch einfach: Bauern laufen ja nur vorwärts, d.h. man kann einen En Passant Schlag machen, genau dann, wenn der Bauer noch in seiner ursprünglichen Reihe steht. Kritischer wird's bei der Rochade: Die darf nur gemacht werden, wenn weder König noch Turm bisher bewegt wurden (und sie können so bewegt werden, dass sie später wieder ihre AUsgangsstellung haben - d.h. daran kann man das nicht erkennen). Die brauchen also wirklich ein Flag, so wie Spacerat beschrieben hat - einen zuätzlichen Parameter brauchen sie aber eigentlich nicht, oder ???:L
 

Marco13

Top Contributor
Oh Mann - es ist ja genau umgekehrt: Der, der einen Doppelzug gemacht hat, kann geschlagen werden :oops: Ich schieb' das mal darauf, dass meine Bemühungen um eine Schach-Engine eindeutig zu lange her sind, und der Morgenkaffe noch nicht gewirkt hat... :oops:
Ich bin im Moment nicht mal sicher, ob es in der Kompetenz der Figur liegen sollte, herauszufinden, welche Züge möglich ist - oder ob das nicht eine "übergeordnete" Instanz bestimmen sollte (die das Brett, alle Figuren, und ggf. den Bisheringen Spielverlauf kennt, einschließlich der Flags, die dort jetzt in den Parametern kodiert werden würden) ???:L Muss bei Gelegenheit mal schauen, was ich damals in meinem Schachprogramm verbrochen habe ;)
 

Leroy42

Top Contributor
Ich bin im Moment nicht mal sicher, ob es in der Kompetenz der Figur liegen sollte, herauszufinden, welche Züge möglich ist - oder ob das nicht eine "übergeordnete" Instanz bestimmen sollte (...) ???:L

Das sehe ich genauso. Die Zugmöglichkeiten in die Kompetenz der Figuren zu legen
mach nur in den allereinfachsten Fällen Sinn. :eek:
 
B

bygones

Gast
es macht keinen Sinn... eine Figur sollte nicht wissen wie der aktuelle Context aussieht.

Jeder Figur hat gewisse Moeglichkeit sich zu bewegen (vor, rueck, seitwaerts, 1x, huepfen etc). Ob das nun wie im aktuellen Kontext ausfaellt ist nicht Sache der Figur (nach dem Motto - Springer huepft ueber Spielbrett)
 
S

Spacerat

Gast
Liegt es nicht in der Kompetenz des Soldaten (Schachfigur), einen Befehl ("makeMove()") zu verweigern, der gegen die Regeln verstösst? Natürlich muss der Soldat die Regeln kennen. Kennt er sie nicht, kann er sie ja in seinem Handbuch (Pre-Conditions) nachschlagen. Deswegen macht es auch durchaus Sinn, die Spielfigur so zu implementieren, dass sie jederzeit eine Anfrage nach möglichen Zügen wahrheitsgemäss beantworten kann. Könnte sie es nicht, bräuchte sie auch keine Methode, wie sie der TS haben möchte.
 
M

maki

Gast
Liegt es nicht in der Kompetenz des Soldaten (Schachfigur), einen Befehl ("makeMove()") zu verweigern, der gegen die Regeln ist? Natürlich muss der Soldat die Regeln kennen. Kennt er sie nicht, kann er sie ja in seinem Handbuch (Pre-Conditions) nachschlagen. Deswegen macht es auch durchaus Sinn, die Spielfigur so zu implementieren, dass sie jederzeit eine Anfrage nach möglichen Zügen wahrheitsgemäss beantworten kann. Könnte sie es nicht, bräuchte sie auch keine Methode, wie sie der TS haben möchte.
Die Frage ist doch eben, ob dass die Verantwortung des "Soldaten" ist (Soldaten sind ja nicht gerade für eigenständige Entscheidungen bekannt, eher nur als Befehlsempfänger), oder ob das Konzept der möglichen Spielzüge nicht als eigentständige Abstraktion und damit Klasse besser umgesetzt wäre.

Bei komplexeren Regeln ist es meist nicht mehr Aufgabe des Fachobjektes diese Regeln zu prüfen, sondern die Regeln selbst stellen ein eingenständiges Konzept dar.
 
B

bygones

Gast
stell dir vor du willst ein Strassenverkehr modellieren.

Modelierst du die Funktionalitaet "fahren" des Objekts "Auto" mit dem Wissen dass es bei Stau anhalten muss ? Dass es im Fall X rueckwaerts fahren muss ? dass es in einer Spielstrasse 5KmH faehrt und auf der Autobahn vollpower ?

nein tut man nicht.

Es ist nicht die Aufgabe des Objektes selber Kontextlogik auszufuehren !

Alles andere ist Vermischung von Verantwortlichkeiten = schlechtes Design
 
S

Spacerat

Gast
stell dir vor du willst ein Strassenverkehr modellieren.

Modelierst du die Funktionalitaet "fahren" des Objekts "Auto" mit dem Wissen dass es bei Stau anhalten muss ? Dass es im Fall X rueckwaerts fahren muss ? dass es in einer Spielstrasse 5KmH faehrt und auf der Autobahn vollpower ?
Nö... nicht wirklich... Aber zumindest würde diese Funktionalität die Möglichkeit bekommen, den Aufruf gegen die Regeln zu prüfen und ggf. mit Exceptions um sich zu schmeissen, wenn sie, vor einer Wand stehend, weiterfahren (objektiv unmöglich) oder in der Spielstasse "vollpower" fahren (straftat) soll.
maki hat gesagt.:
Soldaten sind ja nicht gerade für eigenständige Entscheidungen bekannt, eher nur als Befehlsempfänger
Mag sein... jedoch gibt es Befehle, die Gehorsamsverweigerung (throw Exception) rechtfertigen.
Nun bewegen wir uns hier auf dem niveau der Logik und nicht der Emotionen. Und wenn der TS entscheidet, es wäre eleganter den einzelnen Figuren die jeweils relevanten Regeln bei zu bringen, statt alle Anweisungen gegenzuprüfen, soll es so sein. Natürlich könnte das Gegenprüfen aber entfallen, wenn gewährleistet ist, dass die höhere Instanz nur gültige Anweisungen liefert (sollte auch nicht all zu schwer sein). Dann wäre ein eigenständiges Reglement natürlich eleganter.
 

Leroy42

Top Contributor
Interessant: Wenn sich bei einem stinkinormalen Schachspiel
mein Springer/Pferd weigern sollte einen Zug auszuführen?

Wie sieht das denn in Realität aus? ???:L

Beißt mich dann das Pferd???
:)D)
 
B

bygones

Gast
Nö... nicht wirklich... Aber zumindest würde diese Funktionalität die Möglichkeit bekommen, den Aufruf gegen die Regeln zu prüfen und ggf. mit Exceptions um sich zu schmeissen, wenn sie, vor einer Wand stehend, weiterfahren (objektiv unmöglich) oder in der Spielstasse "vollpower" fahren (straftat) soll.
ganz dumm gefragt - woher weiss die Methode fahren dass vor ihr eine Wand steht ?

mit deiner loesung erlebst du schnell eine riesen wust an code in der funktionalitaet fahren, da dies in jeden erdenklichen Kontext anders ausfaellt. Es waere unmoeglich / unsinnig jegliche Moeglichkeit in dieser Methode unterzubringen (Wand fahren und Spielstrasse sind ja nur 2 moegliche Kontexte).

Anders gesagt - dein Ansatz widerspricht dem SingleResponsibility Konzept. Eine Klasse soll eine Verantwortung haben - beim Auto zB fahren. Es ist nicht die Verantwortung des Autos zu wissen wie und wann zu fahren ist.

Bei der Funktionalitaet oel wechseln willst du auch nicht reinprogrammieren wie der Mechaniker das Oel reinschuettet etc
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
C Java Methoden "Parameter" Problem Java Basics - Anfänger-Themen 16
E Problem beim Übergeben von Parameter an Methode Java Basics - Anfänger-Themen 2
D Parameter einlesen CMD - Problem Java Basics - Anfänger-Themen 2
K Problem mit Parameter von paint(Graphics g) Java Basics - Anfänger-Themen 3
F jsp parameter mitgabe problem Java Basics - Anfänger-Themen 3
C Interface Parameter und Rückgabewerte in Lambda Ausdrücken verwenden Java Basics - Anfänger-Themen 16
C Parameter in verschiedenen Anzahl und Typen Java Basics - Anfänger-Themen 6
M methode aufrufen ohne parameter Java Basics - Anfänger-Themen 1
MiMa Java Doc mehrere Return Parameter Java Basics - Anfänger-Themen 11
BeginnerJava "Weihnachtsbäume" anzeigen: Höhe als Parameter Java Basics - Anfänger-Themen 1
R Methoden Werte einer ArrayList als Parameter übergeben. Java Basics - Anfänger-Themen 4
I Optionaler Parameter bei Methode, der nur optional ist? Java Basics - Anfänger-Themen 6
berserkerdq2 Zwei Klassen Erben von der Klasse A, die eine Klasse kann ich an Methoden übergeben, die als Parameter A haben, die andere nicht? Java Basics - Anfänger-Themen 3
Jambolo Methode, welche die 3 letzten Parameter Werte speichert Java Basics - Anfänger-Themen 20
L Beim Java Programmstart, mehrere Parameter über die Kommandozeile übergeben Java Basics - Anfänger-Themen 9
M Interface als Parameter einer Klasse Java Basics - Anfänger-Themen 8
R Eigenschaft über Parameter auslesen und ändern Java Basics - Anfänger-Themen 15
P Eclipse Karate Framework API Test . Unexpected Error: the trustAnchors parameter must be non-empty Java Basics - Anfänger-Themen 1
X Default Parameter Java Basics - Anfänger-Themen 20
J Interface methode aufrufen (interface parameter) Java Basics - Anfänger-Themen 7
KogoroMori21 Variable im Parameter und Ohne Java Basics - Anfänger-Themen 5
J Bestimmte parameter aus Jsonfile auslesen Java Basics - Anfänger-Themen 15
I JAX-RS Mehrere Parameter in Query Java Basics - Anfänger-Themen 3
H Warum kann man keine Parameter in die main-Methode packen? Java Basics - Anfänger-Themen 4
B Konstruktor mit Array als Parameter Java Basics - Anfänger-Themen 3
D Best Practice Parameter int vs byte Java Basics - Anfänger-Themen 16
L Methode implementieren, Parameter die übergeben werden sind final Java Basics - Anfänger-Themen 4
L Wie greife ich in der Subklasse auf die Parameter einer Methode der Superklasse zu ? Java Basics - Anfänger-Themen 15
C Methoden-Parameter ist Interface Java Basics - Anfänger-Themen 5
J Apache Poi - createCell() Methode akzeptiert keinen Index aus for-schleife als Parameter Java Basics - Anfänger-Themen 4
P Parameter auf Datenformat überprüfen Java Basics - Anfänger-Themen 5
S Hamster Simulator rechnen lernen Parameter int Java Basics - Anfänger-Themen 6
Curtis_MC Parameter-Übergabe bei Klassen und Methoden Java Basics - Anfänger-Themen 12
W Parameter solange addieren bis 13 auftaucht Java Basics - Anfänger-Themen 11
L OOP Parameter mit der Draw-Methode übergeben Java Basics - Anfänger-Themen 11
B Frage zu: String... strings -> Ungleiche Anzahl an Parameter? Java Basics - Anfänger-Themen 4
L Methoden Übergabe von Parameter Java Basics - Anfänger-Themen 3
R Zu viele leere Parameter Java Basics - Anfänger-Themen 8
H Frage zu Parameter einer Methode Java Basics - Anfänger-Themen 2
H Frage zu Parameter einer Methode Java Basics - Anfänger-Themen 3
B Klassen Array Parameter im Konstruktor? Java Basics - Anfänger-Themen 4
V Unbekannte Parameter Java Basics - Anfänger-Themen 1
J Input/Output Input als Parameter an Methoden übergeben Java Basics - Anfänger-Themen 23
B CSV einlesen - Parameter a) encoding b) delimiter Java Basics - Anfänger-Themen 7
U Mehrfacheingabe auf bestimmte Parameter prüfen Java Basics - Anfänger-Themen 8
A festgelegte Parameter Java Basics - Anfänger-Themen 11
PaperHat Methoden als Parameter anderer Methode verwenden Java Basics - Anfänger-Themen 11
D Interface Final für Parameter in überschriebenen Methoden? Java Basics - Anfänger-Themen 3
P Variablen Optionaler Parameter auf der Kommandozeile Java Basics - Anfänger-Themen 12
S Variable Parameter Java Basics - Anfänger-Themen 5
L Variablen Parameter bekommen Java Basics - Anfänger-Themen 13
M Methode mit Array als Parameter an Main übergeben Java Basics - Anfänger-Themen 1
A Aufruf von Konstruktor , obwohl 2 Parameter weggelassen werden Java Basics - Anfänger-Themen 7
A Aufruf von Konstruktor , obwohl 2 Parameter weggelassen werden Java Basics - Anfänger-Themen 0
B Webservice -> alle parameter bekommen von form Java Basics - Anfänger-Themen 2
K Klassenmethode mit übergebenen Parameter speichern Java Basics - Anfänger-Themen 7
I BigDecimal als Parameter verwenden Java Basics - Anfänger-Themen 3
J Parameter in main verwenden Java Basics - Anfänger-Themen 3
J Programm was üer Runtime.getRuntime gestartet wird erkennt String Parameter nicht Java Basics - Anfänger-Themen 0
G Int-Array im Konstruktor Parameter Java Basics - Anfänger-Themen 37
T Parameter das übergeben wurde ändern? Java Basics - Anfänger-Themen 1
D Anfänger-Fragen(Parameter einer Methode) Java Basics - Anfänger-Themen 7
P Operatoren Parameter nicht auf null geprüft? Java Basics - Anfänger-Themen 16
D Name eines JMenue als Parameter übergeben Java Basics - Anfänger-Themen 20
K Dynamischen Supplier für Parameter Java Basics - Anfänger-Themen 12
C Methoden Welche JSoup Methoden Und Parameter für diese HTML Tags Java Basics - Anfänger-Themen 4
A Die Werte zur Berechnung müssen als Parameter übergeben werden? Java Basics - Anfänger-Themen 7
H Klassen Konstruktor Parameter als Instanzvariablen zwischen speichern... Java Basics - Anfänger-Themen 11
W Methoden Methode ohne Parameter auf Instanz eines Objekts aufrufen? Java Basics - Anfänger-Themen 14
M Methode mit Parameter Java Basics - Anfänger-Themen 4
G Objektübergabe durch Parameter Java Basics - Anfänger-Themen 3
J Erste Schritte catch Exeption Parameter Java Basics - Anfänger-Themen 7
A Erste Schritte Methoden mit Parameter Java Basics - Anfänger-Themen 2
D Statische Objekte mit variablem Parameter Java Basics - Anfänger-Themen 1
N Klassen Klassen zwingende Parameter mitteilen Java Basics - Anfänger-Themen 4
L Methoden Methode Parameter vertauschen? Java Basics - Anfänger-Themen 3
C Auswertung Ausdruck mit Punknotation + Objekt als Parameter Java Basics - Anfänger-Themen 3
A Methoden Parameter optionalisieren möglich? - Wie? Java Basics - Anfänger-Themen 19
N Beliebig viele parameter Java Basics - Anfänger-Themen 3
F Methoden: Referenzvariable als Parameter Java Basics - Anfänger-Themen 4
J HttpGet Parameter mitgeben Java Basics - Anfänger-Themen 5
S Generische Methode soll Objekte als Parameter erlauben die bestimmtes Interface implementieren^ Java Basics - Anfänger-Themen 9
T Klasse von erfahren wenn Obertyp Parameter ist Java Basics - Anfänger-Themen 6
J Klassen Fehler mit Parameter des Konstruktors bei einer Objekterzeugung Java Basics - Anfänger-Themen 5
V Parameter in synchronized-Blöcken verstehen Java Basics - Anfänger-Themen 2
M Klasse als Parameter übergeben Java Basics - Anfänger-Themen 7
S Methoden eine Instanz einer eigenen Klasse als parameter übergeben Java Basics - Anfänger-Themen 9
T unterschiedlich viele parameter übergeben Java Basics - Anfänger-Themen 5
V Methoden key value Parameter Java Basics - Anfänger-Themen 11
J Drucker parameter ändern Java Basics - Anfänger-Themen 9
F trustAnchors parameter must be non-empty Java Basics - Anfänger-Themen 0
O Basisklassen als Methoden-Parameter ähnlich, wie in C++ ? Java Basics - Anfänger-Themen 6
D GregorianCalendar als Parameter Java Basics - Anfänger-Themen 2
M Parameter von Konstruktor, der Superklassen-Konstruktor aufruft Java Basics - Anfänger-Themen 2
O ArrayListe sortieren anhand zweier Parameter Java Basics - Anfänger-Themen 4
S Methoden Rückgabewert einer Methode als Parameter an eine andere Methode übergeben, geht das? Java Basics - Anfänger-Themen 5
D Enum als Parameter Java Basics - Anfänger-Themen 6
T In main-Methode Parameter übergeben Java Basics - Anfänger-Themen 3
M Methode als Parameter übergeben Java Basics - Anfänger-Themen 16
Joew0815 Methoden Objekt als Methoden-Parameter - Kein call-by-reference? Java Basics - Anfänger-Themen 12

Ähnliche Java Themen

Neue Themen


Oben