[Eiffel] some clients have access to routine, but not to feature used in precondition

  • Hi,

    1. Wisst ihr wie man in Eiffel in einer Kind-Klasse die redefinierte Methode der SuperKlasse aufrufen kann, ähnlich wie in java mit super:

    Code
    void overridden() {
    super. overridden();
    }


    2. Ich bin grad am Eiffel-Lernen und würde gern meine Klassenvariablen "private" machen, sowie getter/setter methoden dafür implementieren:

    Aber wenn ich das kompiliere, meckert der Eiffel-Kompiler:

    Code
    some clients have access to routine, but not to feature used in precondition

    Ich verstehe das Problem hier nicht ganz, ich stehe addName/removeName methoden zur verfügung - und möchte eigentlich nicht dass jemand der addKunde aufrufen kann auch zugriff auf die Liste hat. Habt ihr hier eine Idee?

    Danke im Vorraus, lg Clemens

    To avoid horrible confusion, please pronounce the G in the word GNU when it is the name of this project.

  • [quote='_Linuxhippy','http://www.informatik-forum.at/testing/forum/…7995#post657995']Hi,

    1. Wisst ihr wie man in Eiffel in einer Kind-Klasse die redefinierte Methode der SuperKlasse aufrufen kann, ähnlich wie in java mit super:

    Code
    void overridden() {
    super. overridden();
    }

    Das Schlüsselwort hierfür ist Precursor().


    2. Ich bin grad am Eiffel-Lernen und würde gern meine Klassenvariablen "private" machen, sowie getter/setter methoden dafür implementieren:

    Private gibt es in Eiffel nicht wirklich. Die Sprache lässt kein direktes Schreiben( wie in public) zu. Für Getter, Setter musst du dir Features anlegen.
    Es besteht also eigentlich kein Grund die names nach NONE zu exportieren, weil von draußen onehin nur lesend zugegriffen werden könnte.


    Aber wenn ich das kompiliere, meckert der Eiffel-Kompiler:

    Code
    some clients have access to routine, but not to feature used in precondition

    Ich verstehe das Problem hier nicht ganz, ich stehe addName/removeName methoden zur verfügung - und möchte eigentlich nicht dass jemand der addKunde aufrufen kann auch zugriff auf die Liste hat. Habt ihr hier eine Idee?

    Das Problem ist leicht erklärt: Eiffel verwendet das klassische Server-Client Prinzip.
    Dabei garantiert ein Client die Precondition und kann sich dann auf den Server verlassen der die Invarianten und Postconditions einhält.
    Dein Client kann allerdings die Precondition nicht garantieren, weil du darin die names abfragst, die zu NONE exportiert sind worauf er also keinen Zugriff hat.

    Falls dich solche Objektorientierten Konzepte interessieren(wie z.B. auch die Kovarianz in Eiffel von Typparametern) kann ich dir übrigends nur Fortgeschrittene Objektorientierte Programmierung bei Professor Puntigam ans Herz legen. Da programmiert man unter anderem auch in Eiffel und Smalltalk.

    Einmal editiert, zuletzt von LordNecro (26. Juni 2010 um 19:52)

  • Das Problem ist leicht erklärt: Eiffel verwendet das klassische Server-Client Prinzip.
    Dabei garantiert ein Client die Precondition und kann sich dann auf den Server verlassen der die Invarianten und Postconditions einhält.
    Dein Client kann allerdings die Precondition nicht garantieren, weil du darin die names abfragst, die zu NONE exportiert sind worauf er also keinen Zugriff hat.


    Soweit ich ihn verstehe, ist ihm das (= das Problem) klar, nicht aber die Lösung. Ohne Eiffel zu kennen: Ich denk mal, mit einer für alle sichtbaren Methode "number_of_names" (oder was auch immer) sollte es vielleicht gehen. Wenn die Precondition über so eine Methode formuliert ist, kann ja der Benutzer der Klasse eben selber prüfen, ob sie erfüllt ist.

    *plantsch*

  • Soweit ich ihn verstehe, ist ihm das (= das Problem) klar, nicht aber die Lösung. Ohne Eiffel zu kennen: Ich denk mal, mit einer für alle sichtbaren Methode "number_of_names" (oder was auch immer) sollte es vielleicht gehen. Wenn die Precondition über so eine Methode formuliert ist, kann ja der Benutzer der Klasse eben selber prüfen, ob sie erfüllt ist.



    Naja das Problem liegt eigentlich schon daran, dass das vom Design her keine Precondition sein sollte.
    Eine Precondition bedeutet in Worten: "Ich als Aufrufer garantiere dir das mein Aufruf alle Kriterien erfüllt". Wenn der Client keinen Zugriff auf die Liste hat kann er das auch nicht garantieren. Man kann den Mechanismus natürlich wie du beschreibst aushebeln, allerdings wenn man schon so rumbasteln muss ist das schon ein deutliches Indiz, dass das kein Fall für ne Precondition sondern für ein simples IF ist.

  • Zitat


    Ich denk mal, mit einer für alle sichtbaren Methode "number_of_names" (oder was auch immer) sollte es vielleicht gehen.

    Danke für den Tip, ich habs nun auch so gelößt.
    Meine Überlegung war, dass der Client im Grunde verantwortlich ist, wieviele Namen er bereits über addName hinzugefügt hat - und somit auch garantieren muss/kann dass er z.B. maximal 2 namen hinzugefügt hat, auch wenn er auf die liste gar keinen Zugriff hat. Wie auch immer, hab die Zugriffsrechte nun etwas gelockert.
    Ein if wäre im Grunde das gleiche in Grün ;)


    Eine letzte Frage hätte ich noch:
    Ich würde gerne Unit-Tests schreiben, welche bei Verletzung der preconditions True zurückgeben sollen, eben um zu zeigen dass die preconditions richtig "anschlagen":

    Aber obwohl die Exception geworfen wird, bekomm ich False zurück.
    Mir ist das zugegebenermaßen ein Rätsel ;)

    Danke vielmals, lg Clemens

    To avoid horrible confusion, please pronounce the G in the word GNU when it is the name of this project.

    5 Mal editiert, zuletzt von _Linuxhippy (27. Juni 2010 um 17:38)

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!