1. Weiterleitung zu NetzLiving.de
  2. Forum
    1. Unerledigte Themen
  3. zum neuen Forum
  • Anmelden
  • Suche
Dieses Thema
  • Alles
  • Dieses Thema
  • Dieses Forum
  • Seiten
  • Forum
  • Erweiterte Suche
  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
Hallo zusammen,

das Informatik-Forum geht in den Archivmodus, genaue Informationen kann man der entsprechenden Ankündigung entnehmen. Als Dankeschön für die Treue bekommt man von uns einen Gutscheincode (informatikforum30) womit man bei netzliving.de 30% auf das erste Jahr sparen kann. (Genaue Infos sind ebenfalls in der Ankündigung)

Vielen Dank für die Treue und das Verständnis!
  • _Linuxhippy
    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

  • LordNecro
    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!
    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.

  • LordNecro
    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
    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 ;)


    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 ;)

    Danke vielmals, lg Clemens

    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.

  1. Datenschutzerklärung
  2. Impressum