Giter Club home page Giter Club logo

kalk's People

Contributors

sydernee avatar vashy avatar

Stargazers

 avatar

Watchers

 avatar  avatar

kalk's Issues

[C++] Prediligere subscripting o set/get

Attualmente è implementato un metodo set(x,y) anche nella parte C++, che viene utilizzato in maniera abbondante, nonostante la presenza dell'operatore di subscripting(che mi sembra più idiomatico).

Meglio quindi preferire res[resX][resY]=(*this)[i][j]; a res.get(resX,resY)=get(i,j); ?

Se sì, continua aver senso mantenere un metodo set e uno get in Matrix? Ovviamente questo NON vale per la parte java, in quanto è perfettamente nel suo stile.

getReference() meglio se protected?

Fixando SparseMatrix mi sono imbattuto nel vecchio metodo get() che ritorna un double&.
Questo metodo veniva overridato in modo che modificasse il dirtyBit e richiamasse il get() del supertipo.
Per ora, essendo getReference() privato, non è più accessibile al sottotipo e va reimplementato. Ho risolto overridando e chiamando l'operatore di subscripting [][].
È da valutare un eventuale cambio modificatore di accesso di getReference().

Java Exceptions

Java Exception. In particolare sui metodi Matrix add(Matrix mat) e Matrix sub(Matrix mat)

Difficoltà nel definire una classe Network

Introduzione

La classe Network modella un social network, in particolare ci interessa conoscere:

  • gli utenti di una rete
  • le relazioni following e followers tra utenti.

Un utente quindi esiste solo all'interno di una e una sola rete e, all'interno della rete, è identificato univocamente da un username.

I problemi che ho incontrato nell'implementazione sono molteplici e l'obiettivo della issue è appunto quella di discutere delle possibili scelte (quale reputiamo sia la migliore).

QMap come contenitore

Si tratta forse dell'unica scelta di cui sono ragionevolmente convinto: inizialmente la mia idea era quella di usare QList invece di QMap, finché non ho messo mano a addUser.
Aggiungere un utente a una rete dovrebbe fare qualcosa del tipo:

void Network::addUser(QString) {
    //controllo che lo user non sia già presente
    ...
    //se presente, aggiungo
    ...
}

Gestire l'accesso concorrente non rientra tra gli scopi del corso, ma visto che QMap (e simili) permettono di garantire che il vincolo di non avere username duplicati a costo zero mi sembra ragionevole scegliere quella strada.

Dubbi

1 - User interno o esterno

Ambo le scelte hanno i loro pro e i loro contro.

User definito internamente a Network

Pros Cons
Un utente non è istanziabile al di fuori di una rete Utente non è estensibile
  Ha poco senso dichiarare virtual i metodi di User e Network

User definito esternamente a Network

Pros Cons
Utente finalmente estensibile User::User dovrebbe essere private o protected
User::operator()== ha senso marchiare virtuale User::User deve dichiarare come friend Network

Tenuto conto dell'OWA mi sembra più ragionevole la seconda opzione (che non è quella attualmente quella presente in Network.h) e di avere almeno un metodo polimorfo, la seconda mi sembra ragionevole, ma il mio ragionamento potrebbe essere fallace. Opinioni in merito?

2 - User(QString,QVector<User*>)

L'idea di base è quella che un utente possa essere costruito data la username e le persone che segue. Il dubbio è se:

  • effettivamente è ragionevole come costruttore
  • è più adatta una QList, seguendo l'esempio di QMap?

inb4

In int Network::User::calculateDistance(const User&, int) const l'ultimo parametro è per decidere se limitare la ricerca o meno a una certa distanza dall'utente. (i.e. evitare di cercare tra tutti gli utenti della rete, ma solo tra quelli al massimo di n-esimo livello)

Tipo di ritorno di transposed() const

Il metodo Matrix transposed() const ritorna un Matrix: non sarebbe più corretto ritornare un Matrix*?

In particolare stavo pensando che la trasposta di una SquareMatrix dovesse ragionevolemente essere ancora una SquareMatrix: è corretto come ragionamento o è meglio mantenere così?

Symmetric in SparseMatrix

Al momento, Symmetric è una proprietà definita solamente in SparseMatrix.

In realtà, è una proprietà delle matrici quadrate. Il problema è che, correggendo la cosa, SparseMatrix rimarrebbe con i soli metodi propri isDense() e getSparsity(), mentre SquareMatrix ne otterrebbe un altro, che ne ha già a sufficienza.

Trovando almeno un altro metodo per SparseMatrix si potrebbe risolvere la questione senza problemi.

Java: Improving dell'inizializzazione delle matrici

In C++ abbiamo il costruttore con std::initializer_list, in Java è un question mark. Per ora, oltre alla funzione di fill() (che in ogni caso, sono valori o fissi o praticamente casuali), non mi è venuto in mente un modo per inizializzare una matrice senza chiamare NxM volte la funzione set().

Con tutta probabilità, ignoro semplicemente il metodo (non ho ancora cercato su Google).

Warning randomico quando si chiude una finestra

Mi capita di ottenere, in modo totalmente randomico (con una percentuale relativamente bassa), un warning quando chiudo una finestra di Kalk:

QXcbConnection: XCB error: 3 (BadWindow), sequence: 1041, resource id: 15784530, major code: 40 (TranslateCoords), minor code: 0

Da tenere sott'occhio.

Branch: GUItesting

Calcolo del determinante e bozza di main file

Aggiungere:

  • un file .pro che permetta la compilazione semplicemente eseguendo qmake e quindi make
  • una funzione main() che includa almeno una stampa di test del determinante
  • un ctor Matrix(unsigned int, unsigned int, std::initializer_list<double>)
  • in Matrix, un metodo Matrix removeCol(pos) const che ritorna un matrice con i valori della colonna rimossa
  • in Matrix, un metodo Matrix removeRow(pos) const che ritorna un matrice con i valori della riga rimossa
  • in SquareMatrix, implementare il metodo determinant() che ritorni un double con il valore del determinante della matrice

Correggere:

  • le maiuscole negli include di Matrix.cpp e SparseMatrix.cpp

EDIT
Non ha senso chiamarle removeCol/removeRow, non è quello che fanno: si lascia per un'altra issue l'onere di valutare se sono utili delle funzioni che ritornano la copia di una riga e di una colonna. (inizialmente le avevo aggiunte a questa issue in quanto mi sembravano poter essere utili per il calcolo del determinante.

Ragionare sul const in SparseMatrix::getSparsity() in C++

Nella classe SparseMatrix, il dirtyBit serve a non calcolare inutilmente la sparsità della matrice a meno che non venga richiesta, poichè necessità di calcolo computazionale e sarebbe da ricalcolare ad ogni set().

Il problema è che per fare ciò in C++, a differenza di Java ove non è un problema, è necessario togliere il const dalla firma del metodo, andando contro alla logica che dovrebbe avere un get().

Idea:

  • Tenere un contatore del numero di celle con valore == 0, e ricalcolare sparsity senza dover ciclare tutta la matrice ogni volta.

Task list: main per java, copy&paste issue, inverseMatrix, new ctor

  • Un main che provi la maggior parte delle funzioni della gerarchia in Java;

  • Trovare la miglior soluzione al problema del copy&paste tra i metodi che vengono overridati nelle sottoclassi, sia in C++ che in Java;

  • Eventuale implementazione di un metodo Matrix inverseMatrix(const Matrix&) const e relativo in Java.

  • Eventuale ctor in C++ come segue:
    Matrix(unsigned int i, unsigned int j, std::vector<std::initializer_list<double>>)
    Nota: non so se può esistere una sintassi del genere, ma è per dare l'idea della funzionalità che dovrebbe implementare.

Quel che mi è venuto in mente alle 00:36, attendo idee mancanti.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.