klasse zur isbn prüfung - O.K??

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • klasse zur isbn prüfung - O.K??

    Hi,

    ich hab hier ne klasse geschrieben die die gültigkeit von isbn Nr. checkt. Fällt jemandem was auf das verbessert werden kann?
    PHP-Code:
    <?php

    //////////////////////////////////////////////////////////
    //         ********** ISBN CLEARING *******************
    //
    //   Class checkIsbn is checking the 10 and 13 digit ISBN
    //   numbers validity. The simplified input got checked by
    //   length and the rules for checksums for ISBN from
    //   http://www.pruefziffernberechnung.de
    //
    //   usage:
    //   $valid = new checkIsbn("3-8155-0063-X");
    //   echo $valid->validIsbn();
    //
    //////////////////////////////////////////////////////////

    class checkIsbn {    
        
        public 
    $isbn;
        
        
    // Get rid of anything except numbers
        
    public function __construct($isbn) {                
            
            
    $this->isbn ereg_replace("[^0-9X]","",$isbn);

        }
        
        public function 
    validIsbn() {
            
            
    //********** CHECK 13 digit ISBN ****************
            
            
    if ( strlen($this->isbn) == 13 ) {
                
                for (
    $i 0$i strlen($this->isbn); $i++) {
                                        
                      
    $digitValue substr ($this->isbn$i1);
                      
                      if ( 
    $i%!= ) {
                          
    // odd numbers will be multiplicated with 3
                          
    $multi3[] = $digitValue;
                      } else {
                          
    // even numbers will sum up
                          
    $multi1[] = $digitValue;
                      }

                }
                
                
    // sum up odd numbers multiplicate with 3 - add sum of even numbers
                // modulo out of 10 must be 0 to be valid
                
    if ( ((array_sum($multi3)*3)+array_sum($multi1))%10 != ) {
                    
    $this->isbnValid false;
                } else {
                    
    $this->isbnValid true;
                }
            
            } 
            
            
    //********** CHECK 10 digit ISBN ****************
            
            
    elseif ( strlen($this->isbn) == 10 ) {
                
                
    // count down for weight of the number
                // run only 9 digits 10th is checksum
                
    $multiple 10;    
                
                
    // run only 9 digits 10th is checksum last is checksum                                                    
                
    for ($i 0$i strlen($this->isbn)-1$i++) {
                                        
                      
    $isbn10[] = substr ($this->isbn$i1)*$multiple;
                      
    $multiple--;
                }
                
                
    // get checksum from input isbn
                
    $checksum10 substr(strtoupper($this->isbn), $i1);
                
    // calculate checksum                    
                
    $isbn10sum 11-round(array_sum($isbn10)%11);
                
                
    //special conditions in isbn rules
                
    switch ( $isbn10sum ) {
                    case 
    10:
                    
    $isbn10sum "X";
                    break;
                    
                    case 
    11:
                    
    $isbn10sum 0;
                    break;
                    
                    default:
                }
                

                
    // status code of ISBN
                
    if ( $isbn10sum == $checksum10 ) {
                    
    $this->isbnValid true;
                } else {
                    
    $this->isbnValid false;
                }

            } 
            
            
    // if not 10 or 13 digit 
            
    else {    
                
    $this->isbnValid false;
            }
            
            return 
    $this->isbnValid;
        }
        
    }

  • #2
    Warum erstellst du für jede ISBN ne neue Instanz?
    Es würde doch reichen, wenn du eine Instanz erstellst und dann an die Methode die Nummern übergibst...
    Müsstest theoretisch nichtmal ne Instanz erzeugen, sondern könntest die Methode auch über static laufen lassen..

    Anders wäre es, wenn du nur 1 Nummer checkst ... dann halte ich die Klasse ansich für nicht so sinnvoll, weil ja ne normale Funktion reichen würde, falls es kein größeres Projekt ist..

    mfg

    Kommentar


    • #3
      Das mit der neuen Instanz für jede ISBN ist tatsächlich großer Schmarrn, hatte ich nicht dran gedacht.
      Der Hinweis auf static ist auch gut, allerdings ist mir nicht ganz klar worin genau der Vorteil liegt wenn auf die Erzeugung eines Objekts verzichtet wird.

      Kommentar


      • #4
        Original geschrieben von toppas
        Der Hinweis auf static ist auch gut, allerdings ist mir nicht ganz klar worin genau der Vorteil liegt wenn auf die Erzeugung eines Objekts verzichtet wird.
        Weil du kein Objekt brauchst, um eine ISBN zu prüfen!
        [FONT="Helvetica"]twitter.com/unset[/FONT]

        Shitstorm Podcast – Wöchentliches Auskotzen

        Kommentar


        • #5
          Ähm ... man kann aber auch übertreiben ... dafür braucht man mit Sicherheit keine Klasse/Objekt.

          Kommentar


          • #6
            Der Hinweis auf static ist auch gut, allerdings ist mir nicht ganz klar worin genau der Vorteil liegt wenn auf die Erzeugung eines Objekts verzichtet wird.
            Deine Klasse hat ja eh nur eine "richtige" Methode. Du könntest mit static direkt auf diese Methode zugreifen und müsstest nicht new bemühen. Dann fiele auch der Konstruktor weg
            Und woher kommt diese Klassmember? In der Klassendeklaration steht dazu nix...
            PHP-Code:
            $this->isbnValid false
            Und wenn du schon mit dem Konstruktor arbeiten willst, dann kann der doch den Aufruf der Prüfmethode übernehmen (spart einen Aufruf)
            PHP-Code:
            public function __construct($isbn) {                
              
            $this->isbn ereg_replace("[^0-9X]","",$isbn);
              
            $this->validIsbn();

            Und statt true und false auf einen Classmember zu speichern kannst du doch direkt einen entsprechenden Boolean Wert zurückgeben. Spart wieder eine Var.
            Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

            [color=red]"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."[/color]
            Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)

            Kommentar


            • #7
              Original geschrieben von jahlives

              Und statt true und false auf einen Classmember zu speichern kannst du doch direkt einen entsprechenden Boolean Wert zurückgeben. Spart wieder eine Var.
              Über den Konstruktor? Wie soll das denn bitte gehen?
              [FONT="Helvetica"]twitter.com/unset[/FONT]

              Shitstorm Podcast – Wöchentliches Auskotzen

              Kommentar


              • #8
                garnicht... aus dem Konstruktor könnte man höchstens eine Exception werfen

                nunja, ich würde dem TS aber auch empfehlen, das alles einfach in eine Funktion zu packen.
                signed oder unsigned... das ist hier die Frage

                Kommentar


                • #9
                  Eine funktion ist das aus dem einfachen grund nicht da ich mich mit objektorientierung beschäftigen will. Aber danke für die hinweise.

                  Kommentar


                  • #10
                    Objektorientierung heißt nicht, dass alles um jeden Preis ein Objekt sein muss.

                    Kommentar


                    • #11
                      Wenn du OOP arbeiten möchtest, könntest du über eine Validate-Klasse nachdenken, welche entsprechende statische Methoden wie isValidISDN besitzt. Weitere Validierungsmethoden kannst du dieser Klasse dann hinzufügen. Extra für die reine Überprüfung eine Instanz zu erstellen ist Overkill!

                      Kommentar


                      • #12
                        Original geschrieben von PHP-Desaster
                        Wenn du OOP arbeiten möchtest, könntest du über eine Validate-Klasse nachdenken, welche entsprechende statische Methoden wie isValidISDN besitzt. Weitere Validierungsmethoden kannst du dieser Klasse dann hinzufügen. Extra für die reine Überprüfung eine Instanz zu erstellen ist Overkill!
                        FullAck! Das war auch mein erster Gedanke.

                        Hat den Vorteil gegenüber einer einfachen Funktion, dass man alles zusammen hat und außerdem die schöne autoload-Funktion von PHP verwenden kann.

                        Kommentar

                        Lädt...
                        X