Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

C# ή VB.NET ?

Îåêßíçóå áðü ôï ìÝëïò Παναγιώτης Καναβός. Τελευταία δημοσίευση από το μέλος sakalis στις 13-12-2012, 12:44. Υπάρχουν 51 απαντήσεις.
Σελίδα 4 από 4 (52 εγγραφές)   < 1 2 3 4
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  08-12-2012, 20:04 71713 σε απάντηση της 71698

    Απ: C# ή VB.NET ?

    Πάρα πολύ ενδιαφέρουσες απαντήσεις για όλους όσους θέλουν να βελτιώνουν την ποιήτητα του κώδικα που γράφουν και να προσπαθούν να μαθαίνουν καινούρια πράγματα.
    Προσωπικά όμως πάντα βρίσκω ποιο ενδιαφέρον όταν βλέπω και ένα συγκεκριμένο παράδειγμα αυτού που περιγράφεται με λόγια.
    Ετσί για μένα θα ήταν πολύ ενδιαφέρον αν ο BruteForce μπορούσε να δώσει ένα παράδειγμα ειδικά για την τακτική στην C# να χρησιμοποιούμε static functions και τι πλεονεκτήματα έχει αυτό.
    Δεν ξέρω βέβαια αν είναι εφικτό να δούμε κάτι τέτοιο με ένα μικρό παράδειγμα ή απαιτεί περισσότερη δουλειά.

    My dream is to fly over the rainbow so high!!!!
  •  10-12-2012, 12:42 71721 σε απάντηση της 71701

    Απ: C# ή VB.NET ?

    Tsopi:
    "γιατί να παιδευτώ", ένα από τα χαρακτηριστικά που ξεχωρίζει τους junior από τους senior developers

    Όχι στην περίπτωση μου. Όταν έχω μια funtion που να εμφανίζει τον χρόνο που έχει περάσει από την αρχή του τραγουδιού σε ένα media player, "σκασίλα" μου αν κάποια στιγμή βγέι ένα οποιοδήποτε πρόβλημα και το φάει η On Error Resume Next. Δεν είναι όλα τα προβλήματα κρίσιμα και χρηματοοικονομικά...

    Λάθος. Μέγα λάθος. Είναι σαν να λέει κάποιος "Εγώ είμαι ευγενικός άνθρωπος, αλλά μόνο εκεί που χρειάζεται, δεν είναι το ίδιο σπουδαίοι όλοι οι άνθρωποι ώστε να απαιτείται ευγένεια".

    Το να "καταπίνει" ή να αγνοεί ο κώδικας το οποιοδήποτε λάθος, είναι... ΛΑΘΟΣ.
    Είναι λάθος να αγνοείς το λάθος.
    Κάνει και αναδρομικό λογοπαίγνιο.

    Όποιος νομίζει ότι είναι σε θέση να κρίνει ποια λάθη έχουν σημασία και ποια όχι, είναι μάλλον πολύ νέος.
    Κατ'αρχάς, όταν γράφεις κώδικα, ποτέ δεν ξέρεις πώς θα επεκταθεί η εφαρμογή, και από που θα καλείται ο κώδικάς σου μετά από μερικά χρόνια.

    Ξέρεις ποιός είναι ένας από τους βασικούς λόγους που πέτυχαν τα Windows; Λόγος που διατρέχει τα τελευταία 15 χρόνια και βάλε;
    H Blue Screen of Death.
    Η BSOD δεν είναι crash, είναι ουσιαστικά ένα kernel message box, που σου λέει όσο πιο ευγενικά γίνεται ότι έκανες κάτι που δεν προβλέπεται, εξαιτίας κάποιου προγραμματιστικού λάθους φυσικά.
    Το οποίο λάθος προφανώς ΔΕΝ μπορούσες να φανταστείς εκ των προτέρων, αλλιώς δεν θα το έκανες.
    Οπότε ο kernel σου κάνει τη χάρη να μην κρασάρει αλλά να παγώσει το σύστημα ώστε να δεις τι έκανες λάθος.

    Ο λόγος που ο kernel είναι τόσο ευγενικός;;;
    Διότι αν το προγραμματιστικός σου λάθος αγνοηθεί, θα γίνει propagate και μετά όχι απλώς είναι βέβαιο ότι θα ακολουθήσουν νέα runtime errors, αλλά θα γίνει τέτοιος χαμός που κανείς δεν θα μπορεί να καταλάβει ποιό είναι το αρχικό λάθος.
    Διότι το αρχικό λάθος είναι αυτό που φταίει συνήθως. Όπως όταν παίρνουμε έναν καταρράκτη από compilation errors στη C++.
    Και μπορεί στο development PC να έχεις την πολυτέλεια να κάνεις debug, όταν όμως σαλτάρει ένας production server/PC τότε την έχεις άσχημα.

    H λογική του να μην αγνοούμε τα λάθη είναι σοφή.
    Όπως π.χ. το να μην αφήνεις warnings στο build, ή να αγνοείς τα false positives του lint (ή άλλων εργαλείων) και να μην τα κάνεις suppress με σχόλιο.
    Μαζεύονται μετά τα άσχετα warnings και κρύβουν τα ουστιαστικά.

    Αν θες να αγνοήσεις την σοφία 20ετίας και πλέον μια ολόκληρης βιομηχανίας και να ξανανακαλύψεις τον τροχό, κάντο και αγνόησε τα errors κατά την κρίση σου.

    Θα μου πεις, άλλη η κρισιμότητα του kernel και άλλη ενός music player.
    Συμφωνώ. Με τον kernel πρέπει να είσαι ιδιαιτέρως εξαιρετικά ευγενικός, εώς διπλωματικός.
    Με ένα χρηματοοικονομικό, εξαιρετικά ευγενικός.
    Με τον music player, απλά πολύ ευγενικός.
    Το να αγνοείς τα λάθη είναι μέγιστη αγένεια ;-)

    Τα λάθη είναι σαν τις γυναίκες. 
    Δεν τους αρέσει να τα αγνοούμε.
    Αν το κάνουμε, they come back with a vengeance ;-)


    The fact that the program works is irrelevant.
  •  10-12-2012, 16:09 71726 σε απάντηση της 71721

    Απ: C# ή VB.NET ?

    Κάποιοι στην κουβέντα ζητήσανε παραδείγματα.
    Επειδή το συγκεκριμένο που ζητήθηκε θεωρώ ότι είναι πολύ απλό και αυτονόητο, σας δίνω ένα παράδειγμα error checking/handling σε κώδικα T-SQL.
    Και από αυτό φανταστείτε τι γίνεται στην C#.
    Απλά αντί για RAISERROR πέφτουν βροχή τα throw InvalidParameterException και όταν ο caller έχει κάπου bug και κάποια στιγμή κάνει invalid call το πιάνουμε αμέσως και το λύνουμε σε 30 δευτερόλεπτα.

    Η τακτική που ακολουθώ πάντα είναι ότι ο έλεγχος των παραμέτρων είναι εξαντλητικός σε όλα τα "Boundaries".
    Όταν ο κώδικας C# καλεί κώδικα SQL, τότε περνάμε ένα boundary, άρα θέλει εξαντλητικό έλεγχο.
    Οι public methods μιας κλάσης είναι boundary.
    Άρα θέλει εξαντλητικό έλεγχο και εκεί, κοκ.
    Στις άλλες περιπτώσεις γίνεται απλός έλεγχος παραμέτρων με βάση την κοινή λογική και με ολίγη από Debug.Assert.

    Όπως βλέπετε παρακάτω, πέρα από τις παραμέτρους, και ΚΑΘΕ statement SQL που πειράζει τη βάση ελέγχεται και βγαίνει custom μήνυμα λάθους ώστε να έχω πλήρη πληροφόρηση για το τι παίχτηκε.
    Θα μπορούσα με BEGIN TRY να τα κάνω στον μισό κώδικα, αλλά μετά θα έπαιρνα ότι error message προαιρείται ο SQL server και θα ψαχνόμουν στο άπειρο.
    Και σιγά μην μου έβαζε μέσα στο μήνυμα το ProcessId ή άλλες χρήσιμες πληροφορίες που μπορεί να θέλω.
    Δεν χρησιμοποιώ BEGIN TRY, παρά μόνο στα upgrade scripts των βάσεων.

    Μου χάλασε λίγο τη στοίχηση το copy paste, αλλά μπορείτε να δείτε ότι όλα τα error checking είναι ένα tab πιο μέσα, ώστε να μην μπερδεύονται με τον υπόλοιπο κώδικα.
    Επίσης το section με τα αρχικά parameter checks ξεχωρίζει από το main body με σχόλια, ώστε γρήγορα να βρίσκω αυτό που θέλω.

    Όπως βλέπετε έχει πολύ κόπο το πλήρες error checking/handling και θέλει πολύ υπομονή.
    Αλλά κάθε βράδυ κοιμάμαι ύσηχος :-)

    Α ναι, και μην ξεχνάτε να ελέγχετε στις stored procedures αν υπάρχει transaction :-)
    Το τι γίνεται όταν ο caller "ξεχάσει" να ξεκινήσει transaction και σκάσει κάποιο λάθος στην SQL έχει πάρα πολύ "πλάκα".
    Είναι από τα αγαπημένα μου horror movies.
    Γι'αυτό και το συγκεκριμένο είναι και ένα από τα αυτοματοποιημένα μας test.
    Enumerate all strprocs και κλήση τους με όλες τις παραμέτρους null και χωρίς transaction.
    Αν δεν γίνει fail με το σωστό error message, τότε έχουμε bug.

    Επίσης παρατηρήστε τη χρήση των "database enums" ώστε ο κώδικας να είναι και περισσότερο αναγνώσιμος.
    Είναι απλές SQL Functions του ενός statement. Η μία return 1, η άλλη return 2, κ.ο.κ.

    Κάντε μου και ένα free code review μήπως υπάρχει και κανα bug ;-)

    CREATE PROCEDURE dbo.InsertAction
    @a_ProcessId int,
    @a_ActionKindId int,
    @a_NewActionId int OUTPUT
    WITH ENCRYPTION AS
    BEGIN
    SET NOCOUNT ON

    /***************************************************
    Parameter Validations
    ***************************************************/
    -- Make sure everything is transactional no matter how we were called
    IF (@@TRANCOUNT = 0)
    BEGIN
    RAISERROR('Invalid call. Transaction required', 11, 0) WITH SETERROR
    RETURN
    END

    --------------------------
    -- Check for NULLs
    --------------------------
    IF ((@a_ProcessId IS NULL) OR (@a_ActionKindId IS NULL))
    BEGIN
    RAISERROR('Invalid parameter. Process or ActionKind Id is NULL', 11, 0) WITH SETERROR
    RETURN
    END

    -- Check that the process exists and is not cancelled or completed
    DECLARE @ProcessState tinyint
    SELECT @ProcessState = ProcessState
    FROM Processes WITH (UPDLOCK, ROWLOCK)
    WHERE (ID = @a_ProcessId)

    IF (@@ROWCOUNT = 0)
    BEGIN
    -- We checked the Process Id is non-null so this means it is invalid.
    RAISERROR('Invalid parameter. Process %d does not exist', 11, 0, @a_ProcessId) WITH SETERROR
    RETURN
    END

    IF (@ProcessState IN (dbo.ProcessState_Completed(), dbo.ProcessState_Cancelled()))
    BEGIN
    RAISERROR('Process %d is not in a state that allows actions to be inserted.', 11, 0, @a_ProcessId) WITH SETERROR
    RETURN
    END

    -- Make sure the process is locked
    IF (dbo.fn_ProcessIsLocked(@a_ProcessId) = 0)
    BEGIN
    RAISERROR('Process %d is not locked.', 11, 0, @a_ProcessId) WITH SETERROR
    RETURN
    END

    -- Pick up the stuff we need from Action Kind
    DECLARE @SubProcessKindId int, @Title nvarchar(100), @Duration int, @Desc nvarchar(400), @DepartmentId int
    SELECT @Title = Title, 
      @Desc = [Description], 
      @DepartmentId = DepartmentId, 
      @Duration = Duration,
      @SubProcessKindId = SubProcessKindId
    FROM ActionKinds
    WHERE (ID = @a_ActionKindId)

    IF (@@ROWCOUNT = 0)
    BEGIN
    -- We checked the ActionKind Id is non-null so this means it is invalid.
    RAISERROR('Invalid parameter. ActionKind %d does not exist', 11, 0, @a_ActionKindId) WITH SETERROR
    RETURN
    END

    /***************************************************
    Do the useful work now
    ***************************************************/
    -- Insert the action detail
    INSERT INTO ActionDetails(Title, [Description])
    VALUES (@Title, @Desc)

    IF (@@ERROR <> 0)
    BEGIN
    RAISERROR('FAILED to insert Action Detail.', 11, 0) WITH SETERROR
    RETURN
    END

    DECLARE @ActionDetailId int
    SET @ActionDetailId = @@IDENTITY
    -- Insert Action
    INSERT INTO Actions WITH (ROWLOCK)
    (
    ProcessId, PKAKId, ActionKindId, ActionDetailId,
    ActionState, ActualStartDate, Duration,
    ActualEndDate, AssignedDepartmentId, AssignedEmployeeId, SortOrder,
    -- We need to set these to a non-default value coz otherwise the
    -- UI takes a long time to reload the Gantt chart while the process
    -- is being edited.
    ExpectedStartDate, -- NORMAL_TIMESTAMP NOT NULL DEFAULT('1/1/1980'),
    ExpectedEndDate, -- NORMAL_TIMESTAMP NOT NULL DEFAULT('1/1/1980'),
    PlannedStartDate, -- NORMAL_TIMESTAMP NOT NULL DEFAULT('1/1/1980'),
    PlannedEndDate -- NORMAL_TIMESTAMP NOT NULL DEFAULT('1/1/1980'),
    )
    VALUES
    (
    @a_ProcessId, NULL, @a_ActionKindId, @ActionDetailId, 
    dbo.ActionState_Waiting(), NULL, @Duration,
    NULL, @DepartmentId, NULL, -1,
    GETDATE(), DATEADD(day, 1, GETDATE()),
    GETDATE(), DATEADD(day, 1, GETDATE()) 
    )

    IF (@@ERROR<>0)
    BEGIN
    RAISERROR('Failed to insert Action', 11, 0) WITH SETERROR
    RETURN
    END

    DECLARE @ActionId int
    SET @ActionId = @@IDENTITY
    SET @a_NewActionId = @ActionId

    -------------------------------
    -- Insert Dynamic Fields
    -------------------------------
    DECLARE DynamicFieldsCursor CURSOR FAST_FORWARD FOR 
    SELECT ActionKindDynamicFields.DynamicFieldId, 
      DynamicFields.FieldType, 
      DynamicFields.DefaultValue
    FROM Actions WITH (NOLOCK)
    INNER JOIN Processes WITH (NOLOCK) ON (Actions.ProcessId = Processes.ID)
    INNER JOIN ActionKinds WITH (NOLOCK) ON (Actions.ActionKindId = ActionKinds.ID)
    INNER JOIN ActionKindDynamicFields WITH (NOLOCK) ON (ActionKinds.ID = ActionKindDynamicFields.ActionKindId)
    INNER JOIN DynamicFields WITH (NOLOCK) ON (DynamicFields.ID = ActionKindDynamicFields.DynamicFieldId)
    WHERE (Actions.ID = @ActionId)

    OPEN DynamicFieldsCursor

    DECLARE @DynamicFieldId int, @FieldType int, @DefaultFieldValue money
    FETCH NEXT FROM DynamicFieldsCursor INTO @DynamicFieldId, @FieldType, @DefaultFieldValue

    WHILE (@@FETCH_STATUS = 0)
    BEGIN
    DECLARE @ValueToInsert nvarchar(80)
    SET @ValueToInsert = NULL

    SELECT  @FieldType = FieldType
    FROM DynamicFields WITH (NOLOCK)
    WHERE ID = @DynamicFieldId

    IF (@DefaultFieldValue IS NOT NULL)
    BEGIN
    IF (@FieldType IN (dbo.DynamicFieldType_Boolean(), dbo.DynamicFieldType_Enum(), dbo.DynamicFieldType_Integer()))
    SET @ValueToInsert = CONVERT(nvarchar, CONVERT(int, @DefaultFieldValue))
    ELSE IF (@FieldType = dbo.DynamicFieldType_Money())
    SET @ValueToInsert = CONVERT(nvarchar, @DefaultFieldValue)
    END

    INSERT INTO DynamicFieldValues(DynamicFieldId, ActionId, FieldValue)
    VALUES (@DynamicFieldId, @ActionId, @ValueToInsert)

    IF (@@ERROR<>0)
    BEGIN
    RAISERROR('Failed to insert into DynamicFieldValue table', 11, 0) WITH SETERROR
    RETURN
    END

    FETCH NEXT FROM DynamicFieldsCursor INTO @DynamicFieldId, @FieldType, @DefaultFieldValue
    END

    CLOSE DynamicFieldsCursor
    DEALLOCATE DynamicFieldsCursor

    -- Action dependencies will be handled by the caller
    -- Graph data will be handled by the caller

    /********************
    SubProcesses
    *********************/
    -- Is it a subprocess action?
    IF (@SubProcessKindId IS NULL)
    RETURN

    DECLARE @SubProcessId int, @MasterProcessId int
    SET @MasterProcessId = dbo.fn_ProcessGroupMaster(@a_ProcessId)

    -- In the normal InsertProcess procedure, the date we pass is the
    -- planned date of the action. Currently we don't have that so we
    -- will pass the current timestamp. Dates recalculation will be
    -- trigger by the caller when all changes are finished.
    DECLARE @SubProcessStartDate NORMAL_TIMESTAMP
    SET @SubProcessStartDate = GETDATE()
    EXEC InsertNewProcess @MasterProcessId, 
     @SubProcessKindId, 
     @SubProcessStartDate, 
     @SubProcessId OUTPUT

    IF (@@ERROR <> 0)
    BEGIN
    RAISERROR('FAILED to insert Sub Process', 11, 0) WITH SETERROR
    RETURN
    END

    INSERT INTO ProcessRelations(MasterProcessId, ActionId, ParentProcessId, ChildProcessId)
    VALUES (@MasterProcessId, @ActionId, @a_ProcessId, @SubProcessId)

    IF (@@ERROR <> 0)
    BEGIN
    RAISERROR('FAILED to insert into ProcessRelations', 11, 0) WITH SETERROR
    RETURN
    END
    END


    The fact that the program works is irrelevant.
  •  11-12-2012, 00:42 71730 σε απάντηση της 71726

    Απ: C# ή VB.NET ?

    Αρχικά να σε ευχαριστήσω για τον κόπο σου μιας και εγώ ζήτησα το παράδειγμα για να καταλάβω τι ακριβώς εννοείς. Smile
    Δουλεύω ως επαγγελματίας .ΝΕΤ developer 3+ χρόνια οπότε έχω πολλά να μάθω ακόμη και κάθε συμβουλή από ποιο έμπειρους συναδέλφους είναι πολύτιμη και προσπαθώ να την καταλάβω και να την εκτιμήσω.

    Το συγκεκριμένο παράδειγμα είναι εκτενές και πλήρες και έπιασα το βασικό νόημα, αν και είναι δύσκολο να το ακολουθήσω πλήρως μιας και δεν έχω καθόλου εμπειρία με T-SQL. Έχω δουλέψει μόνο με ORMs οπότε δεν υπήρξε ανάγκη για SQL μέχρι τώρα. Ξέρω ότι πρέπει να γνωρίζω και SQL ως προγραμματιστής αλλά αυτό είναι θέμα για άλλη συζήτηση μάλλον.

    Για να σχολιάσω το παράδειγμα απλά μου φαίνεται λογικό να θέλει πάρα πολλούς ελέγχους το συγκεκριμένο μιας και είναι ειδική περίπτωση. Σε περίπτωση που είχαμε C# κώδικα και αφού υποθέσουμε ότι ακολουθούμε τις γνωστές αρχές ότι κάθε μέθοδος πρέπει να είναι υπεύθυνη μόνο για μία λειτουργία και συνήθως λίγες γραμμές κώδικα τότε ένας παρόμοιος έλεγχος δεν είναι πολύ δύσκολος και μπορούμε να εκμεταλλευτούμε τα code contracts που υπάρχουν γι αυτήν ακριβώς την δουλειά. Επίσης αν υποθέσουμε ότι κάνουμε Test Driven Development τότε θα πρέπει πρώτα να γράφουμε όλα τα unit tests που εννοείται περικλείουν όλες τις πιθανές περιπτώσεις και με exceptions και στην συνέχεια γράφουμε τον κώδικα για να περάσουν αυτά τα τεστ. Βέβαια και πάλι να γράψουμε τεστ για όλες τις περιπτώσεις είναι δύσκολο και συνήθως χρονοβόρο κάτι που δεν είναι αποδεκτό από το project management αν και είμαι πεπεισμένος πως κάνει pay back ειδική στην συντήρηση του κώδικα από ανθρώπους που δεν τον έγραψαν.

    Αυτό που θα είχε μεγαλύτερο ενδιαφέρον για μένα θα ήταν ένα παράδειγμα σχετικά με τις static functions σε C# και πως αυτό θα μπορούσε να κάνει τον κώδικα μας πιο ασφαλή. Είναι μια τεχνική που δεν μπόρεσα να σκεφτώ πως λειτουργεί. Αλλά δεν μπορώ να ζητήσω ξανά κάτι μιας και ήδη έδωσες ένα παράδειγμα για το τι εννοούσες.

    My dream is to fly over the rainbow so high!!!!
  •  11-12-2012, 12:31 71733 σε απάντηση της 71730

    Απ: C# ή VB.NET ?

    Tα code contracts... άλλο ένα syntactic sugar της MS. Το μισό .ΝΕΤ είναι syntactic sugar τελικά. Ναι αυτή είναι η λογική με αυτά τα contracts. Να ελέγχεις τα pre/post conditions.

    Το Test Driven Development στην πράξη είναι δύσκολο, γιατί όταν η κλάση δεν υπάρχει, δεν ξέρεις και τι κάνει, οπότε πώς θα την τεστάρεις;;;
    Εγώ έχω εφαρμόσει αυτό που ονομάζω "Test Targeted Development", δηλαδή development που φτιάχνει testable modules. Και φυσικά μπαίνω στον κόπο να γράψω και τα tests ή να βάζω άλλους να τα γράψουν. Τώρα που κάνω κουμάντο εγώ, το testing είναι βασικό κομμάτι του development, όχι μία προαιρετική δραστηριότητα.

    Σίγουρα κάνει pay back το testing. Απλά μερικοί άνθρωποι δεν νοιάζονται για τις μετέπειτα συνέπειες επειδή πολύ απλά δεν σκοπεύουν να είναι στην εταιρία όταν θα σκάσουν αυτές οι συνέπειες. Άρα νοιάζονται μόνο για τα short term benefits.
    Αυτόν τον παράγοντα ελάχιστοι τον σκέφτονται ;-)

    Θα σου γράψω άλλη ώρα για τα static.

    The fact that the program works is irrelevant.
  •  11-12-2012, 15:06 71734 σε απάντηση της 71721

    Απ: C# ή VB.NET ?

    Ok, συμφωνώ μαζί σου. Όμως όταν έχω χιλιοπαιδευτεί όπως σου είπα πιο κάτω για ένα backup αρχείο, πραγματικά δεν έχω όρεξη να ασχοληθώ με κάτι σχεδόν απίθανο και για εμένα ασύμαντο. Μιλάμε για την συνάρτηση που εμφανίζει τον χρόνο αναπαραγωγής! Δηαδή το να πάρεις ένα seconds σε integer  και να το μετατρέψεις σε ταμπελίτσα του στυλ  12:30 . Ο κώδικας είναι τόσο απλός και καθαρός,  τα datatypes είναι ηλιθιοδώς μεγάλα ( έχω βάλει int64 για τα seconds) που για κάνει ένα overflow πρέπει να το χρησιμοποιήσει ο τσάκ νόρις. Οκ, να βάλω να ελέγχει το πρόβλημα...αλλά ποιο πρόβλημα ακριβώς να πιάσω?

    Να βάλω Try Catch και να ελένξω τι? Να πέσει αρνητικός αριθμός? Παρόλο που έχω βάλει int64 και οχι uint64 ( μπας και συμβεί ποτέ κάτι), αυτό σημαίνει πως κάτι στο windows media player δεν λειτουργεί σωστά ( επειδή χρησιμοποιώ αυτό το component ) . Και τι υποτήθεται πως πρέπει να κάνω για αυτό? Πως να αναπαραγάγω αυτό το πρόβλημα για να δώ πως να το αντιμετωπίσω?

    Να ελένξω το overflow? Δηλαδή οκ , αν κάνεις overflow σε int64 μιλάμε πως έχεις βάλει τραγούδι να παίζει για 292271023045 χρόνια! ok... δεν με νοιάζει... πρόβλημα του χρήστη!
  •  13-12-2012, 12:44 71746 σε απάντηση της 71733

    Απ: C# ή VB.NET ?

    BruteForce:

    Σίγουρα κάνει pay back το testing. Απλά μερικοί άνθρωποι δεν νοιάζονται για τις μετέπειτα συνέπειες επειδή πολύ απλά δεν σκοπεύουν να είναι στην εταιρία όταν θα σκάσουν αυτές οι συνέπειες. Άρα νοιάζονται μόνο για τα short term benefits.
    Αυτόν τον παράγοντα ελάχιστοι τον σκέφτονται ;-)


    Το θέμα δεν ειναι μόνο οι συνέπειες στο μέλλον. ΤΟ θέμα ειναι ότι με τα unit test μειώνεις και τον χρόνο του development, μειώνεις τα ξενύχτια στο τέλος του deadline μειώνεις το άγχος κτλ κτλ. Επομένως οι παραπάνω δεν νοιάζονται ούτε για τα short term benefits

    Γιώργος Σακαλής
Σελίδα 4 από 4 (52 εγγραφές)   < 1 2 3 4
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems