1. Dashboard
  2. Forum
    1. Unerledigte Themen
  3. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team-Mitglieder
    4. Trophäen
    5. Mitgliedersuche
  4. Tutorial Bereich
  • Deutsch
  • Anmelden
  • Registrieren
  • Suche
Dieses Thema
  1. Informatik Forum
  2. Webmaster & Internet
  3. Entwicklung

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

  • _Linuxhippy
  • 26. Juni 2010 um 18:12
  • Unerledigt
  • _Linuxhippy
    6
    _Linuxhippy
    Mitglied
    Reaktionen
    1
    Punkte
    376
    Beiträge
    64
    • 26. Juni 2010 um 18:12
    • #1

    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:

    Code
    feature {NONE}
            names : LINKED_LIST[String]
    
    
        feature {BANK}
            addKunde (kunde : PERSON)
            require
                name_not_null: names.count > 0
            do
                kunden.put_front (kunde)
            end
    Alles anzeigen

    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.

  • LordNecro
    11
    LordNecro
    Mitglied
    Reaktionen
    40
    Punkte
    1.140
    Beiträge
    211
    • 26. Juni 2010 um 19:48
    • #2

    [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:

    Code
    feature {NONE}
            names : LINKED_LIST[String]
    
    
        feature {BANK}
            addKunde (kunde : PERSON)
            require
                name_not_null: names.count > 0
            do
                kunden.put_front (kunde)
            end
    Alles anzeigen

    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)

  • Plantschkuh!
    24
    Plantschkuh!
    Mitglied
    Reaktionen
    163
    Punkte
    6.173
    Beiträge
    1.181
    • 26. Juni 2010 um 19:59
    • #3
    Zitat von LordNecro

    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*

  • LordNecro
    11
    LordNecro
    Mitglied
    Reaktionen
    40
    Punkte
    1.140
    Beiträge
    211
    • 26. Juni 2010 um 20:03
    • #4
    Zitat von Plantschkuh!

    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.

  • _Linuxhippy
    6
    _Linuxhippy
    Mitglied
    Reaktionen
    1
    Punkte
    376
    Beiträge
    64
    • 27. Juni 2010 um 11:45
    • #5
    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 :winking_face:


    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":

    Code
    [FONT=Courier, Monospaced] [FONT=Courier New]onlySingleZBTest : Boolean 
    local 
      contractViolated : Boolean 
    do 
      if contractViolated then 
        Result := True -- If a violation has happend one round before, just return True 
      else 
        [/FONT][/FONT][FONT=Courier New]routineThatMayFail -- do something, of no violation happens, return  False 
    [/FONT][FONT=Courier New]    Result := False 
      end 
      rescue 
         contractViolated := True 
         retry 
      end 
    end[/FONT]
    Alles anzeigen

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

    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)

  • Maximilian Rupp 27. Dezember 2024 um 00:26

    Hat das Thema aus dem Forum Programmieren nach Entwicklung verschoben.

Jetzt mitmachen!

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

Benutzerkonto erstellen Anmelden

Rechtliches

Impressum

Datenschutzerklärung

  • Alles
  • Dieses Thema
  • Dieses Forum
  • Seiten
  • Forum
  • Lexikon
  • Erweiterte Suche
  • Deutsch
  • English
Zitat speichern