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

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

Δημοσ.

Ποιος απο του δυο παρακατω κωδικες πιο σωστα γραμμενος;

Οταν συνεχιζεται η γραμμη απο κατω πρεπει να ξεκιναει πιο μεσα

ή ακριβως απο κατω;

if (Asd(p.Left, p.Top) && pod < 0
    && ppp == 5 && hal() == 0)
{
    // mpla mpla
    return 2; 
}
if (Asd(p.Left, p.Top) && pod < 0
&& ppp == 5 && hal() == 0)
{
    // mpla mpla
    return 2;
}
  • Απαντ. 35
  • Δημ.
  • Τελ. απάντηση

Συχνή συμμετοχή στο θέμα

Δημοσ.

Πιο "ασχημο" μου φαίνεται το κενο μετα το if

 

Tools->Options->Text Editor-->C#->Formatting->Spacing  ->Insert Space after keywords in control flow statements (ξε-check)

Δημοσ.

Σπάνια θα εσπαγα το if σε 2 γραμμές, αλλα αν για καποιο λόγο το εκανα, θα το έσπαγα τελειως

if 
(	
	Asd(p.Left, p.Top) && 
	pod < 0 &&
	ppp == 5 &&
	hal() == 0	
)
{
    // mpla mpla
    return 2; 
}
Δημοσ.

Πιο "ασχημο" μου φαίνεται το κενο μετα το if

 

Tools->Options->Text Editor-->C#->Formatting->Spacing  ->Insert Space after keywords in control flow statements (ξε-check)

 

και μενα πιο "ασχημο" μου φαινεται.

Δημοσ.

Δεν ξέρω για ποιό όμορφο-άσχημο, πιο κατανοητό είναι το 1ο, αν και θα μπορούσες να έχεις γραμμή/συνθήκη για ακόμα καλύτερα.

Δημοσ.

Εμένα μ αρέσει το 2ο και ναι θα είχα κάθε condition σε άλλη γραμμή και κάθε γραμμή θα άρχιζε με το &&

 

Αλλά είναι θέμα γούστου (όταν γράφεις κώδικα για εσένα). Αν δουλεύεις σε κάποιο project ή ομάδα, τότε ακολουθείς το στυλ της ομάδας

Δημοσ.

private bool IsValid(){ 
  return Asd(p.Left, p.Top) && pod < 0 && ppp == 5 && hal() == 0;
}
if (IsValid()){
    return 2;
}
Ώπα, εδώ ανοίγει άλλη κουβέντα... Αν ο συγκεκριμένος κώδικας χρησιμοποιείται μόνο μια φορά και δεν υπάρχει και παρόμοιο κομμάτι κώδικα (πχ με ppp == 9) θα τον βάζατε σε μέθοδο/συνάρτηση για να φαίνεται καλύτερα;
Δημοσ.

Ώπα, εδώ ανοίγει άλλη κουβέντα... Αν ο συγκεκριμένος κώδικας χρησιμοποιείται μόνο μια φορά και δεν υπάρχει και παρόμοιο κομμάτι κώδικα (πχ με ppp == 9) θα τον βάζατε σε μέθοδο/συνάρτηση για να φαίνεται καλύτερα;

 

Πιθανόν. Απλά το "για να φαίνεται καλύτερα" που λες, όχι τόσο με την έννοια ότι θα χρειαστεί λιγότερο χώρο στον editor. Να το πω με ένα παράδειγμα.

 

Η μία περίπτωση να τραβήξει πολύ μακριά η γραμμή είναι αυτή:

else if (!($relationGraphContext === false || $relationGraphContext instanceof ActiveRecordGraphContext)) {
    throw new \InvalidArgumentException("relationGraphContext");
}

Εδώ το condition είναι προφανές το τι κάνει, ιδιαίτερα αν λάβει κανείς υπόψη και το τι γίνεται μέσα στο else if (το άφησα επίτηδες). Οπότε ναι μεν είναι μακρυνάρι αλλά σα λογική είναι πολύ πολύ απλό και άρα κατανοητό στον αναγνώστη (ο αναγνώστης φανταζόμαστε ότι ξέρει αλλά δεν έχει ξαναδιαβάσει το συγκεκριμένο κώδικα ποτέ -- δύσκολο όταν τον έχεις γράψει ο ίδιος, σίγουρα). Σ' αυτή την περίπτωση δε θα έκανα απαραίτητα κάτι.

 

Από την άλλη, το παράδειγμα που συζητάμε τώρα είναι βέβαια επιτηδευμένο αλλά πολύ συχνά εμφανίζεται και στην πράξη: η συνθήκη είναι μεγάλη επειδή είναι περίπλοκη. Σ' αυτή την περίπτωση είναι πολύ καλή ιδέα να τη βάλεις σε function όχι για επαναχρησιμοποίηση αλλά α) για να τη "βαφτίσεις" και β) γιατί έτσι μειώνεις τη δυσκολία για τον αναγνώστη του αρχικού κώδικα εφόσον δεν τον ενδιαφέρει η λεπτομέρεια του τι θεωρείται "valid" (by the way προφανώς αυτό ήταν παράδειγμα και σκέτο IsValid είναι πολύ κακό όνομα στην πράξη).

 

Για παράδειγμα σκέψου τι θα προτιμούσες να διαβάσεις από τα παρακάτω:

if (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0))
if (IsLeapYear(year))
Δημοσ.

Ποιος απο του δυο παρακατω κωδικες πιο σωστα γραμμενος;

...

 

Όταν γράφεις μόνος σου, επιλέγεις όποιο θέλεις (ή και κάτι άλλο). Αλλιώς ότι έχετε συμφωνήσει με τους υπόλοιπους προγραμματιστές του πρότζεκτ.

 

Προσωπικά προτιμώ μια παραλλαγή του 2ου...

if ( something long
&& (something other long || another long something)
|| yet another something lοng
){
    /* body of if */
}

Ώπα, εδώ ανοίγει άλλη κουβέντα... Αν ο συγκεκριμένος κώδικας χρησιμοποιείται μόνο μια φορά και δεν υπάρχει και παρόμοιο κομμάτι κώδικα (πχ με ppp == 9) θα τον βάζατε σε μέθοδο/συνάρτηση για να φαίνεται καλύτερα;

Εγώ προσωπικά όχι, εκτός από 2 περιπτώσεις:

α) αν υποχρεούμαι να το κάνω όταν δουλεύω με άλλους

β) αν το προτζεκτ είναι μεγάλο και αναβαθμίζεται συχνά. Βοηθάει και στο maintainability, αλλά κυρίως στο scalability. Π.χ. αν χρειαστεί μελλοντικά να μπει κι αλλού ο ίδιος έλεγχος, ή αν χρειαστεί μελλοντικά και να προστεθεί/αφαιρεθεί κάτι στους όρους του ελέγχου και να μπει ο έλεγχος και σε άλλα σημεία του κώδικα (αν το έχουμε macro/συνάρτηση αλλάζουμε μόνο το κώδικά της αντί να ψάχνουμε τον raw έλεγχο σε όλο τον κώδικα).

  • Like 1
Δημοσ.

Με έχει απασχολήσει πολύ αυτό το πρόβλημα! Έχω καταλήξει στο παρακάτω,

Καταρχήν δεδομένου ότι το statement είναι μικρότερο από 80 columns δεν θα πρέπει να σπάσει καθόλου, δεύτερον και προφανές τα bracers στο ίδιο line...

Πάμε στα "αμφιλεγόμενα", αν και εμένα αρχικά μου φαινόταν καλύτερο o operator να πηγαίνει στην από κάτω γραμμή λόγω allignment με όσα open source projects έχω ασχοληθεί και άρθρα έχω διαβάσει βάζουν / προτείνουν τον operator στο πάνω line.

Σχετικά με το κενό της δεύτερης γραμμής ακολουθώ μια ενδιάμεση κατάσταση βάσει bsd style, μισό tab space.

if (Asd(p.Left, p.Top) && pod < 0 &&
  ppp == 5 && hal() == 0) {
    // mpla mpla
    return 2; 
}

Κανονικά θα έπρεπε να είναι σε ενα line βέβαια.

if (Asd(p.Left, p.Top) && pod < 0 && ppp == 5 && hal() == 0) {
    // mpla mpla
    return 2;
}

Γράφω 99% C#, σε πολύ σπάνιες περιπτώσεις να χρησιμοποιήσω ενα lambda variable (func) απο πάνω για να κάνω wrap το expression εαν είναι αρκετά complex.

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

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

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

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

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

Σύνδεση

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

Συνδεθείτε τώρα

  • Δημιουργία νέου...