Hirdetés

Új hozzászólás Aktív témák

  • Drizzt
    nagyúr

    Na valahogy igy nez ki:
    public interface ProjMatrix<M> {
    public ProjMatrix(double[][] mtx);
    public ProjMatrix(M mtx);
    public M getUnderlying();
    public ProjMatrix add(M mtx);
    ..
    }

    Es van harom megvalositas, ebbol ketto ketretegu, az Nd4j-s hasonlo ehhez:
    public class ApacheMatrix implements ProjMatrix<RealMatrix> {
    private final RealMatrix underlying;
    public ApacheMatrix(double[][] mtx){... underlying=new RealMatrix(mtx); ...}
    public ApacheMatrix(RealMatrix mtx){ underlying=mtx; }
    public RealMatrix getUnderlying() { return underlying; }
    public ApacheMatrix add(RealMatrix other) { return new ApacheMatrix(underlying.add(other.getUnderlying());}
    ...

    Es en csinalnek egy ilyet:
    public class FlatMatrix implements ProjMatrix<FlatMatrix> {
    private final double[] data;
    private final dataLen;
    ... // segedvaltozok
    public FlatMatrix(double[][] mtx) { ....dataLen=...; data=new double[dataLen]; ...}
    public FlatMatrix getUnderlying() { return this;}
    public FlatMatrix add(FlatMatrix other) { ... }
    ...

    Persze ebben az esetben az underlying-gal nem lehet "szepen" konstrualni, az tulkepp egy masolas lesz, de ennek nem lenne jelentosege.
    Csak fejbol kb. a lenyeg, lehet benne egyeb hiba, nem az szamit, hanem a konstrukcio osszessegeben mehet-e igy minden gond nelkul.

    Kosz!

    Alapvetően probléma nincsen vele, de én inkább csinálnék egy másik mátrix típust(Matrix), ami teljesen a ProjMatrix implementációitól. És akkor nem lenne generikus a ProjMatrix interface, a getUnderlying helyett meg lenne egy Matrix getMatrix. És az egyes implementációknak lenne az az implementation detail-je, hogy a belső saját mátrixából hogyan fog mátrixot csinálni, factory-kal, különböző bemenő adatok alapján. Pl.: lenne egy ilyen a Matrix createMatrix(double[][] mtx), illetve valami más értelmes adat. A konstruálás paramétereit mindig az vezényelje, hogy milyen adataid lesznek ahol felhasználod ezt az interface-et.

    Működni tökéletesen működni fog amit csináltál, viszont az nem fog nekem tetszeni, hogy a felhasználó kódnak végül mindenképpen tudnia kell a konkrét implementáló osztályokról, mert van olyan method az interface-ben, ami implementáció specifikus értéket vár/ad vissza. Így nem tudod pl.: ServiceLoaderrel betölteni az implementációkat, hanem minden új implementációnál újra kell majd fordítanod a kódot. Ami nem feltétlenül probléma, de egy megfontolandó dolog.

    Ami sérül ebben az interface-ben, az a SOLID design elvekben a "dependency inversion principle". Nem jó practice, ha az interface felhasználója bármilyen specifikus dolgot kell tudjon az implementációból(esetedben az M típust).

Új hozzászólás Aktív témák