migf1 Δημοσ. 19 Ιουλίου 2012 Δημοσ. 19 Ιουλίου 2012 Όσο μεγαλύτερος είναι ο όγκος της δουλειάς τόσο μεγαλύτερη ευλογία είναι το managed-code. Και τόσο πιο πολύπλοκα προβλήματα μπορείς να λύσεις ταχύτερα (κι ευκολότερα). Ιδανικά κατά την άποψή μου κάποιος που ασχολείται επαγγελματικά θα πρέπει να ξέρει ήδη το "από κάτω" για να μπορεί να επιλέγει πότε και γιατί θα χρησιμοποιήσει είτε το "από πάνω" είτε το "από κάτω". Υπό αυτή την έννοια συμφωνώ με τον DownloadPercent πως όποιος επαγγελματίας γνωρίζει μόνο το "από πάνω" έχει συγκριτικό μειονέκτημα έναντι κάποιου που γνωρίζει ΚΑΙ το "από κάτω". Ρεαλιστικά όμως, στην πλειοψηφία των σύγχρονων εφαρμογών (κυρίως στο app programming) το "από πάνω" is the way to go. Ακόμα και με τις "από κάτω" γλώσσες στη συντριπτική πλειοψηφία χρησιμοποιούνται έτοιμες ή υπάρχουσες custom βιβλιοθήκες για την ανάπτυξη μεγάλου όγκου δουλειάς.
defacer Δημοσ. 19 Ιουλίου 2012 Δημοσ. 19 Ιουλίου 2012 Υπό αυτή την έννοια συμφωνώ με τον DownloadPercent πως όποιος επαγγελματίας γνωρίζει μόνο το "από πάνω" έχει συγκριτικό μειονέκτημα έναντι κάποιου που γνωρίζει ΚΑΙ το "από κάτω". Αυτή είναι η άποψη αρκετών από μας σ' αυτό το thread, αλλά δεν είναι η άποψη που εξέφρασε ο DP στο αρχικό του post. Γι' αυτό εξάλλου και απαντήσαμε όλοι. Ναι οκ, απλά εγώ λεω ότι η .ΝΕΤ γλώσσες είναι υπερβολικά εύκολες, δηλαδή κάποιος που ξέρει .ΝΕΤ εγώ τον αντιλαμβάνομαι σαν τον καθένα μας που ξέρει να περνάει προγράμματα στο ΠΣ και να τα ρυθμίζει, δηλαδή σαν απλό χρήστη ενός εργαλείου...
georgemarios Δημοσ. 20 Ιουλίου 2012 Δημοσ. 20 Ιουλίου 2012 Χρησιμοποιείς έτοιμα πράγματα για να αναπτύξεις πραγματα που ΔΕΝ ειναι έτοιμα.....
Downloadpercent Δημοσ. 20 Ιουλίου 2012 Μέλος Δημοσ. 20 Ιουλίου 2012 ΥΓ: δεν ανέφερα το Ιntellisense των .ΝΕΤ γλωσσών που κάνουν την ζωή εύκολη Επειδή κάνει ζέστη, μερικούς σας καταλαβαίνω και δεν σας παρεξηγώ έχουμε και λέμε, ένα απλό παράδειγμα με μια φόρμα και ένα κουμπί C# > using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows.Forms; using System.Drawing; namespace Project1 { class CButton : Form { public CButton() { DrawIt("Click", 100, 25, 100,50); } void DrawIt(String Text, Int32 Width, Int32 Height, Int32 PosX, Int32 PosY) { Button MyButton = new Button(); MyButton.Text = Text; MyButton.Width = Width; MyButton.Height = Height; MyButton.Location = new Point(PosX, PosY); // Add In Form Controls.Add(MyButton); } } } C++ > #include <windows.h> LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); static char gszClassName[] = "Class Name"; static HINSTANCE ghInstance = NULL; int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { WNDCLASSEX WndClass; HWND HWWindow; HWND HWButton; MSG Msg; ghInstance = hInstance; WndClass.cbSize = sizeof(WNDCLASSEX); WndClass.style = NULL; WndClass.lpfnWndProc = WndProc; WndClass.cbClsExtra = 0; WndClass.cbWndExtra = 0; WndClass.hInstance = ghInstance; WndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION); WndClass.hCursor = LoadCursor(NULL, IDC_ARROW); WndClass.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); WndClass.lpszMenuName = NULL; WndClass.lpszClassName = gszClassName; WndClass.hIconSm = LoadIcon(NULL, IDI_APPLICATION); //Register Class if(!RegisterClassEx(&WndClass)) { MessageBox(0, "Window Registration Failed!", "Error!", MB_ICONSTOP | MB_OK); return 0; } // Create Window HWWindow = CreateWindow(gszClassName, "Window Title", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 320, 240, NULL, NULL, ghInstance, NULL); // Create Button HWButton = CreateWindow( "button", "Click", WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON, 100, 50, 100, 30, HWWindow, NULL, NULL, NULL); if(HWWindow == NULL) { MessageBox(0, "Window Creation Failed!", "Error!", MB_ICONSTOP | MB_OK); return 0; } ShowWindow(HWWindow, nCmdShow); UpdateWindow(HWWindow); while(GetMessage(&Msg, NULL, 0, 0)) { TranslateMessage(&Msg); DispatchMessage(&Msg); } return Msg.wParam; } LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) { switch(Message) { case WM_CLOSE: DestroyWindow(hwnd); break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hwnd, Message, wParam, lParam); } return 0; } και στις 2 περιπτώσεις χρησιμοποιούμε έτοιμες συναρτήσεις, ΑΛΛΑ στη C# η δουλειά είναι πολύ πιο εύκολη επειδή υπάρχουν περισσότερες βιβλιοθήκες που μας απαλλάσσουν από κάποιες δουλειές, επίσης η C# διαθέτει συναρτήσεις που κάνουν περισσότερη δουλειά... αυτό θέλω να πω ρε παιδιά, απλά η C# είναι εύκολη γλώσσα! ΥΓ: έτυχε σε αυτό το απλό παράδειγμα να έχουμε 4-5 Included librarys για C# και μόνο 1 για C++....
migf1 Δημοσ. 20 Ιουλίου 2012 Δημοσ. 20 Ιουλίου 2012 ... αυτό θέλω να πω ρε παιδιά, απλά η C# είναι εύκολη γλώσσα! ... Για αυτό ακριβώς είναι καταλληλότερη για την επίλυση πολύπλοκων project. ΥΓ. Btw, αν αντί για Win32 API χρησιμοποιούσες π.χ. QT στη C++ θα ήταν κι εκεί μισός ο κώδικας
moukoublen Δημοσ. 20 Ιουλίου 2012 Δημοσ. 20 Ιουλίου 2012 Το παν το ζυγίζεις με το τι θες να κάνεις. Δεν υπάρχει αυτοσκοπός. Αντίστοιχα λοιπόν κάποιος βλέποντας τον κώδικα που έδωσες σε C++ θα σου πει "Ναι ρε φίλε αλλά με την C++ απλά χειρίζεσαι λίγα πράγματα. Κάντο σε Assembly x86 κατευθείαν να δεις..." Και θα έχει εν μέρη δίκιο. Μόνο που οταν διαβάζεις την παραπάνω φράση σκέφτεσαι "Καλά... Έλεος... Το γ@@@@ες" Γιατί ενστικτωδώς βάζεις τον πήχη στο επίπεδο της C++. Σκέψου. Αύριο αναλαμβάνεις να φτιάξεις ένα τεράστιο CRM για ένα τεράστιο οργανισμό. Βάλε πόσο χρόνο θες να το κάνεις σε C++ (ανάλυση σχεδίαση, συγγραφή κώδικα, δοκιμή, debug, σφάλματα που θα προκύψουν) και βάλε πόσο θες σε C#. Αν κάνεις κοστολόγηση σοβαρή για την περίπτωση της C# θα ζητήσεις το Χ ποσό και θα σου πάρει Υ μήνες. Για την περίπτωση της C++ θα ζητήσεις το m*X ποσό και θα σου πάρει m*Y μήνες. (Αφήνω απ έξω από τη συζήτηση τον ροζ ελέφαντα που είναι μεσα στο δωμάτιο και αφορά το managed - unmanaged περιβάλλον για τέτοια τεράστια εμπορικά projects) Το κάθε τι έχει το σκοπό του και το χώρο του. Δεν είναι αυτοσκοπός το δύσκολο. Δεν είναι αυτοσκοπός το να γίνει κανείς Ramboτου προγραμματισμού. 1
Downloadpercent Δημοσ. 20 Ιουλίου 2012 Μέλος Δημοσ. 20 Ιουλίου 2012 Για αυτό ακριβώς είναι καταλληλότερη για την επίλυση πολύπλοκων project. ΥΓ. Btw, αν αντί για Win32 API χρησιμοποιούσες π.χ. QT στη C++ θα ήταν κι εκεί μισός ο κώδικας αυτό τώρα τι είναι πάλι;
migf1 Δημοσ. 20 Ιουλίου 2012 Δημοσ. 20 Ιουλίου 2012 αυτό τώρα τι είναι πάλι; Σε τι χρειάζεσαι διευκρίνηση;
Downloadpercent Δημοσ. 20 Ιουλίου 2012 Μέλος Δημοσ. 20 Ιουλίου 2012 Σε τι χρειάζεσαι διευκρίνηση; ΤΟ QT, απλά έχουν έτοιμες βιβλιοθήκες για να μας βοηθήσουν? παράγει απ'ευθείας κώδικα μηχανής; αλήθεια, τι παίζει στην αγορά με τις τιμές για απλά προγράμματα http://www.softone.gr/lnkfiles/gr/issue4/SaasinSoft1_2.jpg τέτοιου είδους προγράμματα (λογιστικά κλπ) από όχι TOP Software House (δυστυχώς για το ίδιο πράγμα μια εταιρία με όνομα θα πάρει πολλά περισσότερα) πόσο να κοστίζουν? ( πρέπει να είναι γραμμένο σε VB ) YG: αυτό είναι ένα γενικό πακέτο, για το κοινό... αν ήταν ειδικό , δηλαδή ερχόταν ένας και σου λέγε "θέλω ένα πρόγραμμα περίπου σαν αυτό" ειδική παραγγελία ... πόσο πάει το μαλλί?
migf1 Δημοσ. 20 Ιουλίου 2012 Δημοσ. 20 Ιουλίου 2012 ΤΟ QT, απλά έχουν έτοιμες βιβλιοθήκες για να μας βοηθήσουν? παράγει απ'ευθείας κώδικα μηχανής; ... Cross-platform GUI API για C++ είναι. Παράγει κανονικά κώδικα μηχανής.
nilosgr Δημοσ. 20 Ιουλίου 2012 Δημοσ. 20 Ιουλίου 2012 Ο πατερας μου ειναι υδραυλικος-βοηθος μηχανολογου, οταν αναλαμβανει μια δουλεια, πχ να βαλει καλοριφερ σε μια πολυκατοικια περνςι χαρτι και μολυβι και λυνει εξισωσεις και κανει 3 ωρες. Ενα μηχανολογος περνςι τις διαστασεις των σπιτιων, τις περναει σε ενα προγραμμα και ΒΟΥΑΛΑΑ, βγαινουν ολα μονα τους!! ...ΕΡΩΤΗΣΗ, ποιος ξερει "πιο πολλα";
defacer Δημοσ. 20 Ιουλίου 2012 Δημοσ. 20 Ιουλίου 2012 Αυτό που πολύ σωστά λέει ο migf1 είναι ότι όπως στη C# γράφεις >Button MyButton = new Button(); έτσι και σε ξερή C θα μπορούσες να γράψεις >window* my_button = window_create(BUTTON); Η διαφορά είναι ότι στην πρώτη περίπτωση υπάρχει έτοιμη dll για όλο τον κόσμο όπου κατοικεί όλος ο κώδικας που δεν βλέπεις, ενώ στη δεύτερη τυχαίνει να μην υπάρχει οπότε βάζεις τον κώδικα μπροστά σου και λες "είναι δυσκολότερο". Όταν κάνεις new Button() στη C# τι νομίζεις δηλαδή ότι γίνεται μέσα στη system.windows.forms.dll? Ακριβώς αυτό που έδωσες και στον κώδικα της C. Δεν υπάρχει άλλος τρόπος να δημιουργήσεις κάτι στην οθόνη εκτός από το να καλέσεις (στα Windows) την CreateWindowA ή την CreateWindowW από την user32.dll. Είτε custom δικός σου κώδικας, είτε C++ με Qt, είτε Windows Forms, είτε WPF είτε Python με δεν ξέρω τι αυτό καταλήγουν να κάνουν όλοι. Η μόνη διαφορά είναι ότι στην περίπτωση της C είσαι αναγκασμένος να το κάνεις μόνος σου (κακό) οπότε έμμεσα και αναγκασμένος να μάθεις πώς γίνεται ακριβώς (μπορεί καλό, μπορεί απλά ενοχλητικό). Αν υποθέσουμε ότι ήδη ξέρεις πως γίνεται, τότε η C δε σου προσφέρει τίποτα άλλο εκτός από πρήξιμο (σε επίπεδο συγγραφής κώδικα εννοώ, για να μην έχουμε κανένα ξεσηκωμό του λαού έτσι?). 1
evagelos_21 Δημοσ. 22 Ιουλίου 2012 Δημοσ. 22 Ιουλίου 2012 ... αλήθεια, τι παίζει στην αγορά με τις τιμές για απλά προγράμματα http://www.softone.gr/lnkfiles/gr/issue4/SaasinSoft1_2.jpg τέτοιου είδους προγράμματα (λογιστικά κλπ) από όχι TOP Software House (δυστυχώς για το ίδιο πράγμα μια εταιρία με όνομα θα πάρει πολλά περισσότερα) πόσο να κοστίζουν? ( πρέπει να είναι γραμμένο σε VB ) ... Τι εννοείς "απλά προγράμματα"; Το συγκεκριμένο είναι σε delphi(7)
Directx Δημοσ. 22 Ιουλίου 2012 Δημοσ. 22 Ιουλίου 2012 (επεξεργασμένο) C++ > #include <windows.h> LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); static char gszClassName[] = "Class Name"; static HINSTANCE ghInstance = NULL; int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { WNDCLASSEX WndClass; HWND HWWindow; HWND HWButton; MSG Msg; ghInstance = hInstance; WndClass.cbSize = sizeof(WNDCLASSEX); WndClass.style = NULL; WndClass.lpfnWndProc = WndProc; WndClass.cbClsExtra = 0; WndClass.cbWndExtra = 0; WndClass.hInstance = ghInstance; WndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION); WndClass.hCursor = LoadCursor(NULL, IDC_ARROW); WndClass.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); WndClass.lpszMenuName = NULL; WndClass.lpszClassName = gszClassName; WndClass.hIconSm = LoadIcon(NULL, IDI_APPLICATION); //Register Class if(!RegisterClassEx(&WndClass)) { MessageBox(0, "Window Registration Failed!", "Error!", MB_ICONSTOP | MB_OK); return 0; } // Create Window HWWindow = CreateWindow(gszClassName, "Window Title", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 320, 240, NULL, NULL, ghInstance, NULL); // Create Button HWButton = CreateWindow( "button", "Click", WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON, 100, 50, 100, 30, HWWindow, NULL, NULL, NULL); if(HWWindow == NULL) { MessageBox(0, "Window Creation Failed!", "Error!", MB_ICONSTOP | MB_OK); return 0; } ShowWindow(HWWindow, nCmdShow); UpdateWindow(HWWindow); while(GetMessage(&Msg, NULL, 0, 0)) { TranslateMessage(&Msg); DispatchMessage(&Msg); } return Msg.wParam; } LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) { switch(Message) { case WM_CLOSE: DestroyWindow(hwnd); break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hwnd, Message, wParam, lParam); } return 0; } και στις 2 περιπτώσεις χρησιμοποιούμε έτοιμες συναρτήσεις, ΑΛΛΑ στη C# η δουλειά είναι πολύ πιο εύκολη επειδή υπάρχουν περισσότερες βιβλιοθήκες που μας απαλλάσσουν από κάποιες δουλειές, επίσης η C# διαθέτει συναρτήσεις που κάνουν περισσότερη δουλειά... αυτό θέλω να πω ρε παιδιά, απλά η C# είναι εύκολη γλώσσα! ΥΓ: έτυχε σε αυτό το απλό παράδειγμα να έχουμε 4-5 Included librarys για C# και μόνο 1 για C++.... Και επί εποχής Windows API υπήρχαν τρόποι να διευκολύνουμε την ζωή μας. Για παράδειγμα ο συνηθέστερος τρόπος κατασκευής του UI των εφαρμογών μας εκείνη την εποχή ήταν με την χρήση των Resource Editors (πχ. η Borland έδινε το Resource Workshop) με τους οποίους σχεδίαζες οπτικά την μορφή του παραθύρου σου, την αποθήκευες σε ένα ειδικό αρχείο που αναγνώριζε ο LINKER (με κατάληξη .RC) και ύστερα με την βοήθεια του Dialog Manager (που προσφέρει το Windows API) φόρτωνες και πρόβαλες το "παράθυρο" σου με ελάχιστο κώδικα. Μάλιστα αρκετές εφαρμογές (αλλά προς Θεού όχι όλες!) εκείνης της εποχής βασιζόντουσαν εξ' ολοκλήρου στον Dialog Manager και απέφευγαν την εκ του μηδενός κατασκευή του παραθύρου τους & διαχείριση του message-loop τους από τις ίδιες. Για παράδειγμα το πρόγραμμα που ανάρτησες θα μπορούσε να γραφεί και ως εξής: > /* A simple dialog.. */ #include <windows.h> #include "resource.h" INT_PTR CALLBACK MyDLGPROC(HWND, UINT, WPARAM, LPARAM); int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { HWND MyDialog = NULL; /* Load Dialog Template */ if(DialogBox(hInstance, MAKEINTRESOURCE(IDD_MYDIALOG), NULL, MyDLGPROC) == -1) { MessageBox(NULL, L"DialogBox error!", NULL, MB_ICONSTOP); return 1; } ShowWindow(MyDialog, SW_SHOW); return 0; } INT_PTR CALLBACK MyDLGPROC(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) { switch(Msg) { case WM_INITDIALOG: return TRUE; case WM_CLOSE: PostQuitMessage(0L); break; case WM_COMMAND: switch(LOWORD(wParam)) { case IDCLICKME: MessageBeep(MB_ICONINFORMATION); MessageBox(hWnd, L"Thank you!!", L"", MB_ICONINFORMATION); return TRUE; } break; } return FALSE; } Υ.Γ. 1. Το resource.h και το .rc παράγονται αυτόματα από την VC++ 2008 2. Το πρόγραμμα μπορεί να περιέχει bugs ή άλλες αβλεψίες (πάνε πολλά χρόνια που έπαιζα με τον Dialog Manager). Ύστερα γύρο στις αρχές του '90 ξεφύτρωσαν και τα πρώτα C++ frameworks (για "RAD" ανάπτυξη σε Windows) αρχικά από την Borland (OWL) και ύστερα από την MS (MFC) οπότε η ανάπτυξη έγινε σαφέστατα πιο ανθρώπινη και γρήγορη οπότε μην νομίζεις και τότε & τώρα ο στόχος ήταν, όπως προείπα και στην αρχή του κειμένου, η διευκόλυνση της ζωής μας Επεξ/σία 23 Ιουλίου 2012 από Directx
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα