Jak prawidłowo projektować interfejsy ?

0

No właśnie jak ?

Moje rozumienie interfejsu sprowadza się do tego aby ustandaryzować pewne elementy/funkcjonalności. Na przykład jeżeli mamy obiekty: Client, Person, Car w jakimś tam katalogu to każdy z tych elementów chcemy np. dodać (add), pobrać (get), usunąć(delete). O ile get i delete są proste bo wystarczy podać uid z bazy żeby to wykonać to zastanawia mnie jak radzić sobie z metodami typu add ? No bo przecież każdy z tych obiektów ma inne właściwości.

W jaki sposób należałoby przekazać parametry, aby móc to prawidłowo obsłużyć. najprostsze rozwiązanie - ale wydaje mi się, że równocześnie najgorsze - to tablica String[].

Myśle o jakichś kontenerach, ale jakoś nie widzę tego. Jakie jest Wasze zdanie ?

0

Zazwyczaj tworzy się pośrednika, który implementuje pewien wspólny interfejs:

interace DAO<? extends Persistable>{
   void add(Persistable p);
   void get(Persistable p);
   void del(Persistable p);
}

//..
class Kot implements Persistable{
  //.. właściwości kota
}
//...
class KotDAO implements DAO<Kot>{
   void add(Kot p);
   void get(Kot p);
   void del(Kot p);
}

Jaśniejsze?

0

@Kozoiolek: a Ty jak zwykle - troche dobrze, ale wiecej zle. Wez ten Twoj kod tego DAO, sprobuj skompilowac i policz ile bledow moze zrobic 'pro' w 2 linijkach kodu (add, get i del uwazam za jedna linijke, nie licze zamykajacej klamry), i na przyszlosc naprawde postaraj sie pisac sensownie zeby nie mieszac mlodziezy. Dodaj taki pol-blad ktory polega na bezuzytecznosci tego interfejsu poza pakietem w ktorym zostal zdefiniowany.

public interace DAO<P extends Persistable> {
   void add(P p);
   void get(P p);
   void del(P p);
}

P mozna zamienic czymkolwiek, czeste jest np T (od slowa Type), ale musi byc wszedzie to samo oznaczenie. Nie ogranicza sie do jednej literki.
Persitable to jest interfejs ktory unifikuje twoje encje, moze zawierac rowniez jakies wspolne metody, jak np getId() czy podobne.

0

czym jest Persistable ? mam na myśli ten zapis

public interace DAO

Czyli pierw tworzę interfejs DAO który rozszerza jakiś typ (czy tak ? ), potem klasę któa implementuje ten interfejs (czy nie możesz być to klasa abstrakcyjna skoro te metody i tak są tylko deklaracjami? ) a potem już de facto wykorzystuje to w kodzie

Bo trochę zamieszaliście :D

0

Ostatnia linijka w moim poprzednim poscie mowi co to jest Persistable. To jest jakis interfejs ktory jest czyms co wszystkie Twoje encje maja wspolnego. Moze byc pusty (tzw. marker interface) albo miec jakies wspolne metody. Np. wszystkie encje beda mialy id, wiec mozesz tam wrzucic metode getID / setID.

public interfce DAO

oznacza: tworzysz interfejs DAO ktory jest parametryzowany typem, ktory implementuje / rozszerza typ Persistable. Jak chcesz wiedziec wiecej poczytaj o Java Generics.
Sam interfejs DAO pokazany przez Koziolka jest tez bledny, metoda void get() jest bez sensu - przeciez chcesz zeby cos zwrocila prawda? Nie zauwazylem wtedy tego, skupilem sie na innej bzdurze, powinno byc cos takiego:

public interace DAO<P extends Persistable> {
   void add(P p);
   P get(Long id);
   void del(P p);
}

zakladajac ze Twoje encje beda mialy id typu Long. Zmien wedle widzimisie.

Nastepnie klasy Kot i KotDAO Koziolka sa ok (tylko dodaj public jesli chcesz moc uzywac poza pakietem gdzie sa definiowane, zmien metody na public bo to sie rowniez nie skompiluje, no i zmien metode get na public Kot get(Long id)). Cos w tym stylu. I patrz z razsadkiem na to co tutaj piszemy i sam mysl, bo jak widzisz robimy bledy.

0

W sumie Persistable moze rowniez byc abstrakcyjna klasa, parentem twoich encji, ktora ma w sobie zaimplementowane np id, oraz inne podstawowe wlasciwosci i metody, jak moze data utworzenia i jej getter (setter powinen byc niedostepny i to pole powinno byc generowane automatycznie - tak mysle), generyczny toString lub equals / hashCode, wedlug potrzeb. W ten sposob bedziesz mial zunifikowane tak samo jak z interfejsem, ale pominiesz jeden poziom - brak dodatkowego interfejsu, ale sa ludzie ktorym sie to nie podoba wiec znowu - Twoje widzimisie / potrzeby projektu sa najwazniejsze.

0

no i mam problem

package DAO;

public class CompanyDAO implements DAOInterface<Company> {
    public void add(Company company) {

    }

    public void delete(int uid) {

    }

    public Company get(int uid) {   
        return new Company();
    }
}

public interface DAOInterface<T extends Persistable> {
    public void add(T t);
    public void delete(int uid);
    public T get(int uid);
}

public interface Persistable {
    public int getId();
}

I zwraca następujące błędy:

  • Bound mismatch: The type Company is not a valid substitute for the bounded parameter <T
    extends Persistable> of the type DAOInterface<t>
    • The type CompanyDAO must implement the inherited abstract method
      DAOInterface<company>.add(Persistable)
0

Persistable mussiz sobie sam napisać. A implementowanie interfejsu wygląda np tak: class DupaDAO implements OrganDAO<dupa>.

0

Wyglada na to ze Company nie implementuje Persistable.

0
::. napisał(a)

Wyglada na to ze Company nie implementuje Persistable.

Dokładnie o to chodziło.

Chyba zrozumiałem cały ten myk

Mój obiekt Company implementuje interfejs który deklaruje metody identyczne dla wszystkich obiektów lub po prostu pusty czyli ten marker.

Rozszerzam interfejs CompanyDAO który jest interfejsem dla klas narzędziowych (czyli klasa CompanyDAO jest parametryzowana ??? ) o interfejs Persistable. W ten sposób mam ładną warstę modelową do komunikacji z bazą, która jest odcięta od samego obiektu i wszystko jest ustandaryzowane

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0