Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Πριν κανένα μήνα άρχισα την ενασχόληση με την java και ουσιαστικά την ενασχόληση με τον αντικειμενοστραφή προγραμματισμό. Επειδή δουλεύω 10-12 ώρες την μέρα δεν έχω πολύ χρόνο να ασχοληθώ. Αφού έκανα το course στο codeacadamy και με πολύ ψάξιμο στο ίντερνετ έγραψα ένα πρόγραμμα βιβλιοθήκης. Δεν το έχω τελειώσει ακόμα αλλά μου φαίνεται πως κάπου το έχω χάσει και ότι δεν κάνω σωστή χρήση της γλώσσας. Μάλλον πρέπει να διαβάσω κάποιο βιβλίο.

Θα ηθελα αν έχει κάποιος χρόνο (καλοκαιρίατικα) να ρίξει μια ματιά να μου επισημάνει τα τρανταχτά λάθη.

Το πρόγραμμα το ανέβασα σε github.

 

 

Δημοσ.

Μερικά λάθη που παρατήρησα καθώς έριξα μια ματιά (μόνο) στα αρχεία Author.java & Book.java.

 

1. Αποθηκεύεις όλους τους συγγραφείς/βιβλία στην ίδια την κλάση ενώ θα έπρεπε να το κάνεις σε μια εξωτερική. Π.χ την main όπου θα έχεις ένα ArrayList από Συγγραφείς, ένα άλλο για  βιβλία κλπ.

2. Από την στιγμή που χρησιμοποιείς private μεταβλητές θα πρέπει να έχεις κατάλληλους getter & setter και να μην χρησιμοποιείς το this. στις μεταβλητές αυτές.

3. Στην κλάση Author η ακόλουθη μέθοδος δεν έχει νόημα μιας και δημιουργείς ένα αντικείμενο αλλά δεν το σώζεις κάπου.

private void addBook(String title, Integer relDate) {
       Book newBook = new Book(title, relDate);
}
4. Στην ίδια κλάση με το 3. δεν καταλαβαίνω τι ακριβώς προσπαθείς να εκτυπώσεις, το credit είναι μια μεταβλητή όπου σε κάθε print θα εκτυπώνεται το ίδιο.
(Υποθέτω το book με τις lambda εκφράσεις αντιπροσωπεύει το string που θα σου επιστρέψει κάθε φορά η authorSet).
public void getBooks() {
        authorSet.forEach(book -> System.out.println(credits + " " + book));
}
5. Το this.κάτι είναι περιττό όταν δεν υπάρχει θέμα συσχέτισης μεταβλητών αλλά όχι λάθος. Προσωπικά δεν το χρησιμοποιώ αλλά γούστα είναι αυτά.
6. Όταν μια μέθοδος ξεκινάει με get τότε από σύμβαση πρέπει να επιστρέφει κάτι. Για boolean τιμές οι μέθοδοι ξεκινάνε (συνήθως) με is.
7. Το keyword static στην επικεφαλίδα μιας μεθόδου στην JAVA υποδηλώνει ότι μπορείς να χρησιμοποιήσεις αυτήν την μέθοδο χωρίς αρχικοποίηση του αντικειμένου. Π.χ Book.getTitle() κι όχι απαραίτητα Book book = new Book(....);  book.getTitle();
Αυτό σημαίνει ότι θα πρέπει να αποφεύγεται από μεθόδους οι οποίες δεν είναι ανεξάρτητες αλλά προυποθέτουν κάποια άλλη προηγούμενη ενέργεια(όπως η getTitle, θέλει αρχικοποίηση αλλιώς θα επιστρέψει σκουπίδια).
8. Βοηθητικές μεθόδους που χρησιμοποιούνται μόνο από άλλες μεθόδους της ίδιας κλάσης κι όχι εξωτερικά θα πρέπει να δηλώνονται ως private ώστε να μην υπάρχει access(στους απ' έξω).
9. Για το keyword static στις δηλώσεις μεταβλητών ισχύει το ίδιο με αυτό στις μεθόδους με την διαφορά ότι εδώ αν δηλώσεις νέο αντικείμενο της ίδιας κλάσης θα κρατήσει τις προηγούμενες τιμές που είχε ακόμη κι αν δημιουργήθηκαν από άλλο αντικείμενο. Διάβασε αναλυτικά τι κάνει στο manual της JAVA ή σε κάποιο άρθρο/κείμενο/βιβλίο κι ύστερα χρησιμοποίησε το κατάλληλα. Γενικά δεν είναι καλή πρακτική να το χρησιμοποιείς μιας και χρειάζεται μόνο για ειδικές περιπτώσεις - και κυρίως στο αρχείο όπου υπάρχει η main μιας και static μέθοδοι έχουν access μόνο σε static μεταβλητές της κλάσης τους.
10. Διάβασε ποια είναι η διαφορά μεταξύ public, protected, private και χωρίς κάτι από αυτά μιας και βλέπω πως μια μεταβλητή την δηλώνεις(Author.java) ως protected  αλλά δεν υπάρχει λόγος στην παρούσα φάση.
11. Στο αρχείο Book.java κάνεις το παρακάτω αλλά δεν καταλαβαίνω γιατί αφού η μεταβλητή book είναι μια λίστα από strings αλλά με αυτό το όνομα αφήνει να εννοηθεί ότι κάθε θέση της περιέχει τις πληροφορίες του εκάστοτε βιβλίου κι όχι τις πληροφορίες του κάθε βιβλίου σε πολλές θέσεις.
List<String> book = new ArrayList<>();
....
book.add(title);
book.add("" + relDate);
book.add(availability.avi.name());
book.add("" + borrowedDate);
book.add("" + expiryDate);
12. Οι μεταβλητές καλό είναι να είναι δηλωμένες όλες μαζί, ειδικά όταν πρόκειται για μεταβλητές μιας κλάσης κι όχι μιας μεθόδου.
Κατά συνέπεια κι οι μέθοδοι όλες μαζί όπου κι αυτές θα πρέπει να έχουν μια λογική σειρά. Π.χ πρώτα οι Constructors(όλοι μαζί), μετά όλες μαζί οι getter(ή setter) μέθοδοι ή το ανάποδο κλπ. Η toString συνηθίζεται να δηλώνεται/υλοποιείται στο τέλος.
13. Μέθοδοι τύπου Boolean isAvailable() καλό είναι να μην αλλάζουν τις πληροφορίες που περιέχει/ουν κάποια/ες μεταβλητή/ες. Διάβασε τα pre/post - condition, σε μεθόδους τι είναι constructor, accessor/selector, observer, transformer κλπ.
Κάποια είναι απλές συμβάσεις, κάποια είναι για λόγους αισθητικής ενώ κάποια άλλα είναι απαραίτητο να ακολουθούνται. 
Δεν είναι απαραίτητο να κάνεις ότι ανέφερα κατά γράμμα αλλά καλό είναι ειδικά κάποια συγκεκριμένα να τα ακολουθείς.
 
Ελπίζω να σε βοήθησα κι όχι να σε μπέρδεψα περισσότερο :)

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...