Autor Zpráva
DesPatt
Profil *
Dobrý den, potřeboval bych radu s objektovým poskládáním aplikace. Mám třídy jako je User, Student, Teacher. Tyto třídy v podstatě dělají to stejné (zápis do db, modifikace dat, výpis...) ale každá to dělá trochu jinak, nad jinou tabulkou. zkusil jsem tedy použít návrhový vzor Adapter. Pro každou z těchto třídy jsem vytvořil třídu UserMySQLAdapter, StudentMySQLAdapter...
Problém je pokud Student nebo Učitel potřebují provádět nějakou akci která už není pro všechny společná (není v rozhraní) pak jí nemůžu zavolat.
Mám to zhruba nějak takto:

 interface IDatabaseAdapter
{
    function Insert(object item);
    function Select(id);
    function SelectAll();
    function Delete(object item);
}

class StudentMySQLAdapter extends IDatabaseAdapter
{
    public function Insert(Student $student)
    {
             //MYSQL
    }

    public function Select($id)
    {
          //MYSQL
    }
    public function SelectAll()
    {
          //MYSQL
    }
    public function Delete(Student $item)
    {
         //MYSQL
    }
}

abstract class DbItem 
{
     //IDatabaseAdapter
     protected $adapter;
    
     public function __construct(IDatabaseAdapter $adapter)
     {
                $this->adapter = $adapter;
      }

    public abstract function Save();
    public abstract function Read();
    public abstract function ReadAll();
    public abstract function Remove();
}

class Student extends DbItem
{
     public function __construct($name, $address...)
     {
            parent::__construct(new StudentMySQLAdapter());
     }

    public function Save()
    { 
        $this->adapter->Insert($this);
     }
    public function Read()
    {
       $this->adapter->Select($this->id);
    }
    public function ReadAll()
    {

    }
    public function Remove()
    {

    }

     //Zjistí jaké má student známky
     //Vrací pole předmětů a známek.
    public function MyResults()
    {
       //Nelze volat přes adaptér, protože příslušná metoda není v rozhraní. Kdyby tam byla, mohl by podobnou metodu implementovat i třeba učitel...
    }
}

Děkuji za pomoc
Bertram
Profil
Myslím si, že jste se do toho moc zamotal a adaptér by měl zůstat pouze prostředníkem dvou rozhraní, kdy rozhraní vaší aplikace zůstává neměnné a pouze měníte adaptér v závislosti na použítí komponenty se kterou vaše aplikace komunikuje pomocí adaptéru.

Na ř.9 by mělo být implements místo extends, rozhraní se nedědí.

Také si myslím že student není potomkem databázové položky, ale mohl by existovat objekt, který by měl na starost správu studentů a ten by řekl adaptéru ať např. studenta Karáska vymaže z databáze.
juriad
Profil
DesPatt:
Zkus si pročíst a pochopit http://www.oracle.com/technetwork/java/dataaccessobject-138824.html. Je to přesně to co chceš akorát v Javě, princip je však shodný.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: