Εξάρτηση ένεση σε C ++




Αυτό είναι επίσης ένα ερώτημα που έθεσα σε ένα σχόλιο σε ένα από τα Miško Hevery για [συνομιλίες google](http://misko.hevery.com/2008/11/11/clean-code-talks-dependency-injection/) που ασχολούνται με την εξάρτηση της ένεσης, αλλά θάφτηκαν στα σχόλια.


Αναρωτιέμαι πώς μπορεί το βήμα του εργοστασίου / κατασκευαστή της καλωδίωσης των εξαρτήσεων μεταξύ τους μπορούν να εργαστούν σε C ++.


Δηλ έχουμε μια τάξη Α που εξαρτάται από B. Η οικοδόμος θα διαθέσει Β στο σωρό, να περάσει ένα δείκτη προς Β σε κατασκευαστή Α, ενώ επίσης την κατανομή στο σωρό και να επιστρέψει ένα δείκτη προς Α


Ποιος καθαρίζει μετά; Είναι καλό να αφήσει ο οικοδόμος καθαρίσει μετά το κάνει; Φαίνεται να είναι η σωστή μέθοδος δεδομένου ότι στη συζήτηση που λέει ότι ο οικοδόμος θα πρέπει να αντικείμενα ρυθμίσεων που αναμένεται να έχουν την ίδια διάρκεια ζωής ή τουλάχιστον οι εξαρτήσεις έχουν μεγαλύτερη διάρκεια ζωής (έχω και μια ερώτηση σχετικά με αυτό). Αυτό που θέλω να πω στον κώδικα:



```
class builder {
public:
    builder() :
        m_ClassA(NULL),m_ClassB(NULL) {
    }
    ~builder() {
        if (m_ClassB) {
            delete m_ClassB;
        }
        if (m_ClassA) {
            delete m_ClassA;
        }
    }
    ClassA *build() {
        m_ClassB = new class B;
        m_ClassA = new class A(m_ClassB);
        return m_ClassA;
    }
};

```

Τώρα αν υπάρχει μια εξάρτηση που αναμένεται να διαρκέσει περισσότερο από τη διάρκεια ζωής του αντικειμένου που την έγχυση σε (ας πούμε ClassC είναι ότι η εξάρτηση) Καταλαβαίνω ότι πρέπει να αλλάξουμε τον τρόπο κατασκευής σε κάτι σαν:



```
ClassA *builder::build(ClassC *classC) {
    m_ClassB = new class B;
    m_ClassA = new class A(m_ClassB, classC);
    return m_ClassA;
}

```

Ποια είναι η προτιμώμενη προσέγγιση σας;
Αυτή η συζήτηση είναι για Java και ένεση εξάρτησης.  



Στην C ++ προσπαθούμε **ΔΕΝ** να περάσει RAW δείκτες γύρω. Αυτό οφείλεται στο γεγονός ότι ένα RAW δείκτης δεν έχουν σημασιολογία ιδιοκτησίας που συνδέονται με αυτό. Αν δεν έχετε την κυριότητα τότε δεν ξέρουμε ποιος είναι υπεύθυνος για τον καθαρισμό του αντικειμένου.


Θεωρώ ότι οι περισσότεροι από την ένεση εξάρτηση του χρόνου γίνεται μέσω αναφορών σε C ++.   

Στις σπάνιες περιπτώσεις όπου θα πρέπει να χρησιμοποιήσετε τους δείκτες, τα τυλίγουμε σε [std :: unique\_ptr <>](http://www.cplusplus.com/reference/memory/auto_ptr/) ή [std :: shared\_ptr <>](http://www.cplusplus.com/reference/memory/shared_ptr/) , ανάλογα με το πώς θέλετε να διαχειριστείτε την ιδιοκτησία.   

Σε περίπτωση που δεν μπορείτε να χρησιμοποιήσετε C ++ 11 χαρακτηριστικά, χρησιμοποιήστε std :: auto\_ptr <> ή να ενισχύσει :: shared\_ptr <>.


Θα ήθελα επίσης να επισημάνω ότι η C ++ και Java στυλ του προγραμματισμού είναι σήμερα τόσο αποκλίνουσες ότι η εφαρμογή του στυλ μιας γλώσσας στην άλλη, θα οδηγήσει αναπόφευκτα σε καταστροφή.
Αυτή είναι η γνώμη μου, αλλά? όπως ακριβώς και οι τάξεις περίπτωση δεν, θα ήθελα να εφαρμόσουν μια `copy`μέθοδο του είδους στην τάξη για να καταστεί δυνατή η τροποποίηση, διατηρώντας παράλληλα το αμετάβλητο, αλλά υπάρχει ορισμένες περιπτώσεις που δεν μπορώ να βοηθήσω να το μεταβλητό? Για παράδειγμα, όταν κάτι αναμένεται να γίνει η λειτουργία αντιγραφής είναι πολύ μεγάλη και αργή για την κατηγορία? όπως όταν η τάξη έχει τόσα πολλά συχνά τροποποιημένο μέλη. Και μην ανησυχείτε για χιλιάδες περιπτώσεις που επιπλέουν γύρω στη μνήμη, επειδή είναι αυτόματα GC'ed, οπότε το πιο πραγματικό πρόβλημα είναι ο χρόνος κόστος της αντιγραφής περιπτώσεις της κλάσης. Παρακαλώ πείτε μου εάν η γνώμη μου είναι κάπως λάθος :) αν η βρύση του νεροχύτη είναι τοποθετημένη στον τοίχο τότε υπάρχει βρύση πλυντηρίου που παρεμβάλλεται. αν η βρύση είναι τοποθετημένη στον πάγκο του νεροχύτη, τότε αν βρεθεί και μπεί εξάρτημα στην έξοδο της βρύσης για να συνδεθεί το λάστιχο, αυτό θα γίνει αιτία να χαλάσει γρήγορα η βρύση, από την απρόβλεπτη πίεση που θα αναπτύσσει στην έξοδο της όταν το πλυντήριο δεν θα τραβά νερό. τρουλλινός γιώργος , υδραυλικός, αθήνα , αττική, 6932860310. <p><strong> συνολικά: </strong></p><p>τόσο το put όσο και το post μπορούν να χρησιμοποιηθούν για τη δημιουργία.</p><p>πρέπει να ρωτήσετε "σε τι εκτελείτε τη δράση;" να διακρίνετε τι πρέπει να χρησιμοποιείτε. ας υποθέσουμε ότι σχεδιάζετε ένα api για να κάνετε ερωτήσεις. εάν θέλετε να χρησιμοποιήσετε το post τότε θα το κάνετε σε μια λίστα ερωτήσεων. εάν θέλετε να χρησιμοποιήσετε το put τότε θα το κάνετε αυτό σε μια συγκεκριμένη ερώτηση.</p><p><strong> μεγάλη και οι δύο μπορούν να χρησιμοποιηθούν, έτσι ποιο πρέπει να χρησιμοποιήσω στο restful σχεδιασμό μου: </strong></p><p>δεν χρειάζεται να υποστηρίζετε τόσο το put όσο και το post.</p><p>το οποίο χρησιμοποιείται παραμένει στο χέρι σας. αλλά θυμηθείτε να χρησιμοποιήσετε το σωστό, ανάλογα με το αντικείμενο που αναφέρετε στο αίτημα.</p><p>μερικές σκέψεις:</p><ul> <li>ονομάζετε ρητά τα αντικείμενα url που δημιουργείτε ή αφήστε το διακομιστή να αποφασίσει; εάν τους ονομάσετε τότε χρησιμοποιήστε put. εάν αφήσετε τον διακομιστή να αποφασίσει στη συνέχεια, χρησιμοποιήστε το post.</li> <li>put είναι idempotent, οπότε αν put ένα αντικείμενο δύο φορές, δεν έχει καμία επίδραση. αυτή είναι μια ιδιοκτησία της νίκαιας, οπότε θα μπορούσα να χρησιμοποιήσω το put όταν ήταν δυνατόν.</li> <li>μπορείτε να ενημερώσετε ή να δημιουργήσετε έναν πόρο με put με την ίδια διεύθυνση url αντικειμένου</li> <li>με το post μπορείτε να έχετε 2 αιτήματα που εισέρχονται ταυτόχρονα για τροποποιήσεις σε μια διεύθυνση url και μπορεί να ενημερώσουν διαφορετικά μέρη του αντικειμένου.</li> </ul><p><strong> ένα παράδειγμα: </strong></p><p> <a href="https://stackoverflow.com/questions/256349/what-are-the-best-common-restful-url-verbs-and-actions/256359#256359">έγραψα τα εξής ως μέρος μιας άλλης απάντησης σχετικά με το so</a> :</p><blockquote> <p><strong> post: </strong></p> <p>χρησιμοποιείται για την τροποποίηση και την ενημέρωση ενός πόρου</p> <pre><code>post /questions/&lt;existing\_question&gt; http/1.1 host: www.example.com/ </code></pre> <p>σημειώστε ότι το ακόλουθο είναι ένα σφάλμα:</p> <pre><code>post /questions/&lt;new\_question&gt; http/1.1 host: www.example.com/ </code></pre> <p>εάν η διεύθυνση url δεν έχει δημιουργηθεί ακόμη, δεν θα πρέπει να χρησιμοποιείτε το post για να το δημιουργήσετε ενώ καθορίζετε το όνομα. αυτό θα πρέπει να έχει ως αποτέλεσμα ένα σφάλμα 'πόρος δεν βρέθηκε' επειδή το <code>&lt;new\_question&gt;</code> δεν υπάρχει ακόμα. πρέπει πρώτα να τοποθετήσετε τον πόρο <code>&lt;new\_question&gt;</code> στον διακομιστή.</p> <p>θα μπορούσατε όμως να κάνετε κάτι τέτοιο για να δημιουργήσετε πόρους χρησιμοποιώντας post:</p> <pre><code>post /questions http/1.1 host: www.example.com/ </code></pre> <p>σημειώστε ότι σε αυτήν την περίπτωση το όνομα του πόρου δεν έχει καθοριστεί, η διαδρομή url των νέων αντικειμένων θα σας επιστραφεί.</p> <p><strong> σημειωση: </strong></p> <p>χρησιμοποιείται για τη δημιουργία ενός πόρου ή για την αντικατάστασή του. ενώ ορίσετε τους πόρους νέα διεύθυνση url.</p> <p>για έναν νέο πόρο:</p> <pre><code>put /questions/&lt;new\_question&gt; http/1.1 host: www.example.com/ </code></pre> <p>για να αντικαταστήσετε μια υπάρχουσα πηγή:</p> <pre><code>put /questions/&lt;existing\_question&gt; http/1.1 host: www.example.com/ </code></pre></blockquote> Η προτιμώμενη μέθοδος είναι να χρησιμοποιήσετε πραγματικά την ιδιότητα υπό όρους για να τυλίξει τις κλήσεις εντοπισμού σφαλμάτων σας, μην χρησιμοποιήσετε τις οδηγίες μεταγλωττιστή. #ifs μπορεί να πάρει δύσκολες και μπορεί να οδηγήσει σε περίεργα προβλήματα κατασκευής.


Ένα παράδειγμα της χρήσης ενός υπό όρους χαρακτηριστικό είναι η εξής (σε C #, αλλά λειτουργεί σε VB.NET πολύ):



```
[ Conditional("Debug") ]
private void WriteDebug(string debugString)
{
  // do stuff
}

```

Κατά τη μεταγλώττιση, χωρίς το σετ σημαία DEBUG, κάθε κλήση προς WriteDebug θα καταργηθούν όπως υποτίθεται συνέβαινε με Debug.Write (). ανάλογα την επισκευή που θα κάνετε. αν πχ θέλετε να αντικαταστήσετε τον πυκνωτή ή την πλακέτα με τον διακόπτη των ταχυτήτων τότε αρκεί να έχετε κλειστό το ρεύμα , αν όμως θέλετε να αλλάξετε την φτερωτή ή τον ρότορα πρέπει να έχετε απομονώσει τον κυκλοφορητή και από το ρεύμα και από το νερό της εγκατάστασης. τρουλλινός γιώργος , υδραυλικός , αθήνα , αττική , 6932860310. Κάνατε πολύ καλή δουλειά στο να συνοψίσετε τι είναι φοβερό στο Node.js. Η αίσθησή μου είναι ότι το Node.js είναι ιδιαίτερα κατάλληλο για εφαρμογές όπου θα θέλατε να διατηρήσετε μια μόνιμη σύνδεση από το πρόγραμμα περιήγησης πίσω στον διακομιστή. Χρησιμοποιώντας μια τεχνική γνωστή ως ["long-polling"](https://en.wikipedia.org/wiki/Push_technology#Long_polling), μπορείτε να γράψετε μια εφαρμογή που στέλνει ενημερώσεις στον χρήστη σε πραγματικό χρόνο. Η πραγματοποίηση long polling σε πολλούς από τους γίγαντες του διαδικτύου, όπως το [Ruby on Rails](https://en.wikipedia.org/wiki/Ruby_on_Rails) ή το [Django](https://en.wikipedia.org/wiki/Django_%28web_framework%29), θα δημιουργούσε τεράστιο φόρτο στον διακομιστή, επειδή κάθε ενεργός πελάτης τρώει μια διεργασία του διακομιστή. Αυτή η κατάσταση ισοδυναμεί με επίθεση [tarpit](https://en.wikipedia.org/wiki/Tarpit_(networking)). Όταν χρησιμοποιείτε κάτι όπως το Node.js, ο διακομιστής δεν έχει ανάγκη να διατηρεί ξεχωριστά νήματα για κάθε ανοιχτή σύνδεση. 


Αυτό σημαίνει ότι μπορείτε να δημιουργήσετε μια [εφαρμογή συνομιλίας με βάση το πρόγραμμα περιήγησης](https://github.com/rivalslayer/node_chat) σε Node.js που δεν χρειάζεται σχεδόν καθόλου πόρους συστήματος για να εξυπηρετεί πολλούς πελάτες. Κάθε φορά που θέλετε να κάνετε αυτού του είδους τη μακροχρόνια αναζήτηση, το Node.js είναι μια εξαιρετική επιλογή. 


Αξίζει να αναφέρουμε ότι και η Ruby και η Python έχουν εργαλεία για να κάνουν κάτι τέτοιο ([eventmachine](http://rubyeventmachine.com/) και [twisted](https://twistedmatrix.com/trac/), αντίστοιχα), αλλά ότι το Node.js το κάνει εξαιρετικά καλά, και από την αρχή. Η JavaScript είναι εξαιρετικά καλά τοποθετημένη σε ένα μοντέλο ταυτόχρονης λειτουργίας βασισμένο σε callback, και υπερέχει εδώ. Επίσης, η δυνατότητα σειριοποίησης και αποσειριοποίησης με JSON εγγενές τόσο στον πελάτη όσο και στον διακομιστή είναι αρκετά έξυπνη.


Ανυπομονώ να διαβάσω άλλες απαντήσεις εδώ, αυτή είναι μια φανταστική ερώτηση.


Αξίζει να επισημάνουμε ότι το Node.js είναι επίσης εξαιρετικό για καταστάσεις στις οποίες θα επαναχρησιμοποιήσετε πολύ κώδικα σε όλο το χάσμα πελάτη/εξυπηρετητή. Το [Meteor framework](https://meteor.com) το κάνει αυτό πολύ εύκολο, και πολλοί άνθρωποι προτείνουν ότι αυτό μπορεί να είναι το μέλλον της ανάπτυξης ιστοσελίδων. Μπορώ να πω από την εμπειρία μου ότι είναι πολύ διασκεδαστικό να γράφεις κώδικα στο Meteor, και ένα μεγάλο μέρος αυτού είναι να ξοδεύεις λιγότερο χρόνο σκεπτόμενος πώς θα αναδομήσεις τα δεδομένα σου, ώστε ο κώδικας που εκτελείται στο πρόγραμμα περιήγησης να μπορεί εύκολα να τα χειριστεί και να τα μεταβιβάσει πίσω.


Εδώ είναι ένα άρθρο για το Pyramid και το long-polling, το οποίο αποδεικνύεται ότι είναι πολύ εύκολο να ρυθμιστεί με λίγη βοήθεια από το gevent: [*TicTacToe και Long Polling με την Pyramid*](http://michael.merickel.org/2011/6/21/tictactoe-and-long-polling-with-pyramid/). αν δεν γράφατε ότι είναι τεσσάρι του 4ου ορόφου θα νόμιζα ότι ίσως λέγατε για το δικό μου διαμέρισμα που και εγώ δεν έχω ανάψει την αυτόνομη ούτε λεπτό. πάντως και εγώ αναρωτιέμαι πως γίνεται και δεν το ανάβω αλλά περισσότερο αναρωτιέμαι μέχρι πότε και πόσο θα αντέξουμε. μάλιστα σκέπτομαι να κάνω θέμα για τον συντελεστή επιβάρυνσης (fi ei) . δηλαδή στις 0 ώρες να αντιστοιχεί μηδενική χρέωση. τρουλλινός γιώργος 6932860310 υδραυλικές εργασίες σε όλη την αθήνα - αττική γκύζη, παλλήνη, ελληνικό, φιλοπάππου, αμπελόκηποι αν στάζει το αποσυνδεδεμένο σώμα, τότε στάζει γιατί στραγγίζει (αν δεν το αδειάσατε καλά), αν όμως στάζει κάποια τάπα ή διακόπτης από την μεριά των σωλήνων τότε χρειάζεται καλύτερο σφίξημο. τρουλλινός γιώργος, 6932860310. αν η βρύση του νεροχύτη είναι τοποθετημένη στον τοίχο τότε υπάρχει βρύση πλυντηρίου που παρεμβάλλεται. αν η βρύση είναι τοποθετημένη στον πάγκο του νεροχύτη, τότε αν βρεθεί και μπεί εξάρτημα στην έξοδο της βρύσης για να συνδεθεί το λάστιχο, αυτό θα γίνει αιτία να χαλάσει γρήγορα η βρύση, από την απρόβλεπτη πίεση που θα αναπτύσσει στην έξοδο της όταν το πλυντήριο δεν θα τραβά νερό. τρουλλινός γιώργος 6932860310 υδραυλικές εργασίες σε όλη την αθήνα - αττική , κερατέα, νέα χαλκηδόνα, μοσχάτο, βάρη, ανάβυσσο αν αλλάξει το σύστημα των σωλήνων από δισωλήνιο αν έχετε δισωλήνιο σε μονοσωλήνιο, ίσως ο κυκλοφορητής να θέλει άλλαγμα. καλύτερα να έχει το κάθε διαμέρισμα τον δικό του κυκλοφορητή από την άποψη ότι θα έχει εξασφαλισμένη την αναγκαία ποσότητα νερού που χρειάζεται το κάθε διαμέρισμα με βάση τις θερμίδες του, καθώς και το ότι όταν λειτουργεί την αυτόνομη θέρμανση ένα μόνο διαμέρισμα, δεν θα λειτουργεί ένας κυκλοφορητής που κάνει για τρία διαμερίσματα. βέβαια και σε αυτή την περίπτωση μπορεί να μπεί ένας κυκλοφορητής (αυτόματα ρυθμιζόμενος ) ή να μπεί βαλβίδα ανακούφισης αλλά έχουν και αυτά το κόστος τους σε αγορά υλικού ή ρυθμίσεων. όταν γίνει η μετατροπή σε αυτόνομη στην πράξη ή στα σχέδια, τότε θα ρωτήσετε σε κάποιο κατάστημα που αντιπροσωπεύει τον έναν ή τον άλλο κυκλοφορητή και με βάση τις θερμίδες πχ του β ορόφου που τελικά έγινε πχ για 16000 θερμίδες την διάμετρο και το μήκος των σωλήνων και την υψομετρική διαφορά από τον λέβητα και θα σας πούν μοντέλο και τιμή. τρουλλινός γιώργος 6932860310 υδραυλικές εργασίες σε όλη την αθήνα - αττική αγία βαρβάρα, μοσχάτο, νέα φιλαδέλφεια, πειραιά, περιστέρι, κορωπί