php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger

PHP Einsteiger PHP Problemlösungen für Spracheinsteiger
Archive: 2004, 2004/2, 2005, 2005/2, 2006, 2007, 2008, 2009, 2010,

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 19.01.2011, 14:06  
Gesperrt
 
Registriert seit: 03.12.2010
Beiträge: 860
PHP-Kenntnisse:
Anfänger
coola wird schon bald berühmt werden
Standard [Erledigt] Vorgehensweise Kontrolle von Abhängigkeiten

Hallo

Eine Frage zur richtigen Vorgehensweise.

Im folgenden Beispiel habe ich 2 Properties:
- a
- b

Zwischen diesen Properties gibt es eine Abhängigkeit:
Ist b>100, muss a<=100 sein.

Mögliche Werte:
Code:
b     a     OK
0     0     ja
0     1000  ja
1000  0     ja
1000  1000  nein
Variante 1 - Kontrolle in setter/getter:
PHP-Code:
class X
{
   private 
$a;
   public function 
setA($a)
   {
      if(
$a>100 && $this->getB()>100// hier wird kontrolliert
         
throw new Exception();
      
$this->$a;
   }
   public function 
getA()
   {
      return 
$this->a;
   }

   private 
$b;
   public function 
setB($b)
   {
      if(
$b>100 && $this->getA()>100// und hier wird auch kontrolliert
         
throw new Exception();
      
$this->$b;
   }
   public function 
getB()
   {
      return 
$this->b;
   }

   public function 
ab()
   {
      echo 
$this->a,' ',$this->b;
   }
}
$x = new X();
$x->setA(50);
$x->setB(50);
$x->ab(); 
Variante 2 - Kontrolle erst dann, wenn mit $a oder $b gearbeitet wird (Methode ab):
PHP-Code:
class X
{
   private 
$a;
   public function 
setA($a)
   {
      
$this->$a;
   }
   public function 
getA()
   {
      return 
$this->a;
   }

   private 
$b;
   public function 
setB($b)
   {
      
$this->$b;
   }
   public function 
getB()
   {
      return 
$this->b;
   }

   public function 
ab()
   {
      if(
$this->getB()>100 && $this->getB()>100// hier wird nur ein einziges mal kontrolliert
         
throw new Exception();
      echo 
$this->a,' ',$this->b;
   }
}
$x = new X();
$x->setA(50);
$x->setB(50);
$x->ab(); 
Wie ist denn die richtige Vorgehensweise?
coola ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 19.01.2011, 14:38  
Erfahrener Benutzer
 
Benutzerbild von lstegelitz
 
Registriert seit: 07.09.2009
Beiträge: 4.005
PHP-Kenntnisse:
Fortgeschritten
lstegelitz ist einfach richtig nettlstegelitz ist einfach richtig nettlstegelitz ist einfach richtig nettlstegelitz ist einfach richtig nett
Standard

DAS ist Definitionssache...

Angenommen, du arbeitest intern mit den 2 Werten und holst sie dir direkt aus den Membervariablen (ohne über die Prüffunktion zu gehen) hast du ein Problem, wenn nicht beim setzen kontrolliert wird.

Andererseits ist beim Setzen von a eventuell b noch nicht bekannt, daher kann gar nicht beim Setzen überprüft werden...

Da deine beiden Member private sind, können die Werte ausschliesslich von Funktionen der Klasse verwendet werden. Ich würde eine Prüfmethode schreiben, die ich VOR der Benutzung der Variablen aufrufen würde. Diese muss dann aber auch die Fälle abfangen, das a nicht geprüft werden kann, wenn b nicht bekannt ist (und umgekehrt). D.h. ich persönlich würde Beispiel 2 bevorzugen (Codeblöcke mehr als einmal zu schreiben heisst auch immer, mehr potentielle Fehlerquellen zu haben)
__________________
Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.
lstegelitz ist offline   Mit Zitat antworten
Alt 19.01.2011, 14:51  
Erfahrener Benutzer
 
Registriert seit: 25.09.2009
Beiträge: 2.114
PHP-Kenntnisse:
Fortgeschritten
BlackScorp wird schon bald berühmt werdenBlackScorp wird schon bald berühmt werden
Standard

man könnte doch gleich eine checkAB methode erstellen, damit ist dann gesichert dass man nur dann prüfen kann, wenn acuh 2 werte vergeben sind..

PHP-Code:
class X
{
   private 
$result 'ja';

   
   public function 
checkAB($a,$b)
   {
  
      if(
$a>100 && $b>100) {
         
$this->result 'nein';
      }  
   
   }
 

   public function 
getResult()
   {
      return 
$this->result;
   }

}
$x = new X();
$x->checkAB(0,0); //wenn nur a oder b eingegeben wird, gibt es ein fehler weil 2 parameter erwartet werden
echo $x->getResult().'<br/>';
$x->checkAB(0,1000); 
echo 
$x->getResult().'<br/>';
$x->checkAB(1000,0); 
echo 
$x->getResult().'<br/>';
$x->checkAB(1000,1000); 
echo 
$x->getResult().'<br/>'
__________________
Mein kleines Projekt
-Cruel Online-
5 von 3 Leuten können kein Bruchrechnen

Geändert von BlackScorp (19.01.2011 um 15:00 Uhr).
BlackScorp ist offline   Mit Zitat antworten
Alt 19.01.2011, 15:49  
Moderator
 
Benutzerbild von Asipak
 
Registriert seit: 18.07.2005
Beiträge: 4.072
Asipak sorgt für eine eindrucksvolle AtmosphäreAsipak sorgt für eine eindrucksvolle Atmosphäre
Standard

Dann würde ich mir aber gleich von checkAB() das boolesche Ergebnis der Prüfung zurückgeben lassen und nicht erst den Umweg über eine weitere Methode gehen. Zumal ein String für einen Wahrheitswert eher ungeeignet ist.

Zitat:
Im folgenden Beispiel habe ich 2 Properties:
- a
- b

Zwischen diesen Properties gibt es eine Abhängigkeit:
Ist b>100, muss a<=100 sein.
Warum? Interessant wäre es, den Kontext zu kennen. Wofür ist diese Klasse gedacht?
Asipak ist offline   Mit Zitat antworten
Alt 19.01.2011, 15:51  
Erfahrener Benutzer
 
Registriert seit: 25.09.2009
Beiträge: 2.114
PHP-Kenntnisse:
Fortgeschritten
BlackScorp wird schon bald berühmt werdenBlackScorp wird schon bald berühmt werden
Standard

@asipak, mir ist das klar, ich wollte lediglich seine ausgangstabelle darstellen
__________________
Mein kleines Projekt
-Cruel Online-
5 von 3 Leuten können kein Bruchrechnen
BlackScorp ist offline   Mit Zitat antworten
Alt 19.01.2011, 16:43  
Gesperrt
 
Registriert seit: 03.12.2010
Beiträge: 860
PHP-Kenntnisse:
Anfänger
coola wird schon bald berühmt werden
Standard

Zitat:
Warum? Interessant wäre es, den Kontext zu kennen. Wofür ist diese Klasse gedacht?
Eigentlich war diese Frage allgemein gedacht. Aber um konkreter zu werden: ich lerne momentan ItemSearch von Amazon AWS: http://docs.amazonwebservices.com/AW...gsVarybyLocale
coola ist offline   Mit Zitat antworten
Alt 20.01.2011, 01:28  
Gesperrt
 
Registriert seit: 03.12.2010
Beiträge: 860
PHP-Kenntnisse:
Anfänger
coola wird schon bald berühmt werden
Standard

Ich glaube, die Variante 1 kann man nicht verwenden.

Lt. AWS ist folgende Abhängigkeit definiert:
"Gibt es in der ResponseGroup ein 'RelatedItem', muss es auch ein RelationshipType geben."

Ich habe versucht, das in der Variante 1 umzusetzen:
PHP-Code:
<?php
   error_reporting
(-1);
   class 
AWS
   
{  
      private 
$responseGroup = array('Small');
      public function 
setResponseGroup(array $value)
      {
         if
         (
            
in_array('RelatedItem'$value) && // Zu einem 'RelatedItem'
            
!$this->getRelationshipType()      // muss es auch eine relationshipType geben.
         
)
            throw new 
Exception(1);
         
$this->responseGroup $value;
      }
      public function 
getResponseGroup()
      {
         return 
$this->responseGroup;
      }

      private 
$relationshipType;
      public function 
setRelationshipType($value// string oder null
      
{
         if
         (
            !
is_string($value) &&
            
$value!==null
         
)
            throw new 
Exception(2);
         if(
is_string($value))
         {
            
$rg $this->getResponseGroup();
            if(!
in_array('RelatedItem'$rg)) // Ein relationshipType macht nur Sinn
               
throw new Exception(3);        // in Verbindung mit einem 'RelatedItem'.
         
}
         
$this->relationshipType $value;
      }
      public function 
getRelationshipType()
      {
         return 
$this->relationshipType;
      }
   }

   
// Test 1:
   //$aws = new AWS();
   //$aws->setResponseGroup(array('RelatedItem')); 
   // NOK, weil relationshipType noch nicht gesetzt ist

   // Test 2:
   //$aws = new AWS();
   //$aws->setRelationshipType('abc'); // zum Testen beliebiger String
   // NOK, weil in der responseGroup 'RelatedItem' noch nicht gesetzt ist
?>
Die Kontrollen in den settern kommen sich gegenseitig in die Quere.

Ist wohl das schon angesprochene Problem:
Zitat:
Andererseits ist beim Setzen von a eventuell b noch nicht bekannt, daher kann gar nicht beim Setzen überprüft werden...
Was meint ihr dazu?

P. S.
- Im Endeffekt gäbe es in setResponseGroup noch weitere Kontrollen.
- $value von setRelationshipType darf nur bestimmt Wert haben. Würde dann auch noch kontrolliert werden.

Geändert von coola (20.01.2011 um 01:33 Uhr).
coola ist offline   Mit Zitat antworten
Alt 20.01.2011, 11:43  
da schreibt der ElePHPant
 
Benutzerbild von Flor1an
 
Registriert seit: 18.06.2008
Beiträge: 8.903
PHP-Kenntnisse:
Fortgeschritten
Flor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer Anblick
Standard

Ja wenn das so ist, dann kann man das natürlich nicht einzeln Prüfen. Dann brauchst du entweder eine Methode die beide Werte gleichzeitig übergeben bekommt und entsprechend prüft. Oder eben eine extra Routine die du dann aufrufen musst um zu prüfen ob jetzt wirklich alles korrekt ist.
Flor1an ist offline   Mit Zitat antworten
Alt 20.01.2011, 22:25  
Moderator
 
Benutzerbild von Chriz
 
Registriert seit: 11.05.2008
Beiträge: 6.267
Chriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer Anblick
Standard

Spendier deiner Klasse halt eine validate/check Methoden, die die Konsistenz prueft.
__________________
"Nuschel ich?" - "Was?"
Chriz ist offline   Mit Zitat antworten
Alt 21.01.2011, 11:20  
Gesperrt
 
Registriert seit: 03.12.2010
Beiträge: 860
PHP-Kenntnisse:
Anfänger
coola wird schon bald berühmt werden
Standard

Zitat:
check Methoden
Darauf läuft es wohl hinaus. Bin ich gerade dabei.

Ich glaube, das Thema kann man auf gelöst setzen.
coola ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
php design - vorgehensweise kaptainIglo PHP Einsteiger 10 24.12.2010 15:30
Netz von Objekten mit Abhängigkeiten darstellen/zeichnen serPHPico PHP-Fortgeschrittene 12 25.08.2010 18:52
Vorgehensweise bei der Umsetzung eines Projektes e.tech Software-Design 10 13.08.2010 14:01
[Erledigt] Vorgehensweise bei Cronjops mcfly232 PHP Tipps 2010 2 24.07.2010 23:59
[Erledigt] timestamp kontrolle der gesamten DB Rutor PHP Tipps 2010 20 04.02.2010 13:20
Formular zur Kontrolle ausgeben, in DB schreiben und per HTML-Mail versenden Nanerl PHP Tipps 2009 12 04.11.2009 14:30
User Kontrolle TaStEn PHP Tipps 2008 4 21.10.2007 10:06
vorgehensweise datenabgleich tomson Datenbanken 1 07.09.2006 11:58
[Erledigt] Vorgehensweise neue Seite HTML, Usability und Barrierefreiheit 1 09.03.2006 10:44
[Erledigt] Vorgehensweise bei großen Datenmengen PHP-Fortgeschrittene 11 16.08.2005 00:19
PHP Mail Kontrolle PHP Tipps 2005-2 3 10.08.2005 01:00
Kontrolle bei Registrierung: Nickname schon vergeeben??? PHP Tipps 2005-2 2 28.06.2005 08:56
eMail kontrolle PHP Tipps 2004-2 1 20.12.2004 13:01
[Erledigt] create table - Kontrolle Datenbanken 1 15.10.2004 11:51
kontrolle ob zahlen ein bestimmtest format haben? Promaetheus PHP Tipps 2004 11 26.08.2004 14:53

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
vorgehensweise kontrolle, php code kontrolle, amazon \relationshiptype\, http://www.php.de/php-einsteiger/76268-erledigt-vorgehensweise-kontrolle-von-abhaengigkeiten.html, aws relationshiptype php

Alle Zeitangaben in WEZ +2. Es ist jetzt 17:53 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum