хвастаемся оформлением кода

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by realcoder, 16 Oct 2012.

  1. realcoder

    realcoder Member

    Joined:
    9 Dec 2010
    Messages:
    226
    Likes Received:
    11
    Reputations:
    4
    я после 4-х лет программирования код оформляю так. кусок проекта:
    хидер.
    PHP:
    #include <WinSock2.h>
    #include <Windows.h>
    #include <string>

    struct parametrs//т.к. поток статический и не является методом класса, то передаются параметры из класса в немго через струкутру
             
    SOCKET s;//сокет
             
    void (* _handler) (void *,int);//обработчик поступления новых данных
            
    };

        class 
    rawclient{
        private:
            
    WSAData ws;
            
    HANDLE hThread;
            
    DWORD id;
            
    parametrs pars;
            
            

        protected:
            
    SOCKET s;
            
    void (* handler) (void *,int);



        public:
            
    rawclient();

            ~
    rawclient();

            
    bool connectto(std::string *hostname,int port);

            
    bool senddata(void *bufer,int size);

            
    void setReciveHandler(void (* rh) (void *,int));

            
    int revcdata(void *bufer,int size);

            
        };

    сам cpp-файл:
    PHP:
    #include <WinSock2.h>
    #include <Windows.h>
    #include <string>

    #include "httpclient.h"


            
    unsigned long __stdcall thProc(parametrs *p)//поток проверки сокета на получение данных
            
    {
              
    fd_set    fd;
              while(
    true)
              {
                
    FD_ZERO(&fd);
                
    FD_SET(p->s, &fd);//устанавливаем сокет во множество проверяемых сокетов
                
    select(0, &fdNULLNULLNULL);//проверяем, нет пришли ли на сокет данные
                
    if(FD_ISSET(p->s, &fd) && p->s!=INVALID_SOCKET){//если да
                        
    const size_t size_delta=128;//получаем по 128 байт
                        
    size_t offset=0;
                        
    size_t size=size_delta;
                        
    void *buffer=malloc(size);
                        
    bool bDataFlag=false;//флаг что у нас есть хотябы несколько байт данных
                        
    int recvd=0;
                        do
    //увеличиваем память и кладем туда данные, пока они есть
                        
    {
                            
    recvd=recv(p->s,(char *)((size_t)buffer+offset),size_delta,0);
                            if(
    recvd>0bDataFlag=true;//изменем его только 1 раз когда получиди первую партию данных, которая больше 0
                            
    size+=size_delta
                            
    buffer=realloc(buffer,size);
                            
    offset+=size_delta;
                            
    memset((char *)((size_t)buffer+offset),0,size_delta);
                        } while(
    recvd==size_delta);//пока получаем ровно чтолько сколько просили. остальное является признаком что уже все
                        
    if(bDataFlag)    p->_handler(buffer,size);//вызываем обработчик
                        
    free(buffer);//чистим память
                
    }
              }
              return 
    0;
           }

            
    rawclient::rawclient()//конструктор класса(стартап сокетов, создание сокета)
            
    {
                
    WSAStartup(MAKEWORD(2,2),&ws);
                
    s=socket(AF_INET,SOCK_STREAM,IPPROTO_IP);
            }

            
    rawclient::~rawclient()
            {
    //в деструкторе закрываем сокет и останавливаем поток
            
    closesocket(s);
            
    TerminateThread(hThread,0);
            
    CloseHandle(hThread);
            }

            
    bool rawclient::connectto(std::string *hostname,int port//подключение
            
    {
            
    sockaddr_in sa;//резолвинг чез DNS
            
    HOSTENT *h=gethostbyname(hostname->c_str());
            
    sa.sin_addr.S_un.S_addr=*(u_long *)(*h->h_addr_list);
            
    sa.sin_family=AF_INET;
            
    sa.sin_port=htons(port);
            return (
    connect(s,(sockaddr *)&sa,sizeof(sa))==0)?true:false;
            }

            
    bool rawclient::senddata(void *bufer,int size)//отправка
            
    {
            return (
    send(s,(const char *)bufer,size,0)==size)?true:false;
            }

            
    int rawclient::revcdata(void *bufer,int size)//отправка
            
    {
            return 
    recv(s,(char *)bufer,size,0);
            }

            
    void rawclient::setReciveHandler(void (* rh) (void *,int))//установка обработчика и запуск проверки сокета
            
    {
             
    handler=rh;//устанвавливаем обработчик
             
    parametrs *p=new parametrs;
             
    p->s=s;
             
    p->_handler=handler;
             
    hThread=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)thProc,p,0,&id);//создаем поток проверки состояния сокета
            
    }

            
    выкладывайте куски своих проектов
     
  2. {iddqd}

    {iddqd} Member

    Joined:
    22 Dec 2011
    Messages:
    170
    Likes Received:
    99
    Reputations:
    2
    PHP:
    <script>alert()</script>
     
    2 people like this.
  3. drim

    drim Member

    Joined:
    27 Aug 2009
    Messages:
    347
    Likes Received:
    33
    Reputations:
    4
    комменты убийственные, делают код грязным.
    phpDocumentor для комментов чем не устраивает?
     
  4. FunOfGun

    FunOfGun Elder - Старейшина

    Joined:
    5 Sep 2012
    Messages:
    388
    Likes Received:
    72
    Reputations:
    124
    Бью код на логические блоки и распихиваю по методам, в методах юзаю пустые строки как разделители, коменты вообще не юзаю(стараюсь писать так, что бы код сам был наглядным коментом).
    П.С. все остальное делает Visual Studio
     
    #4 FunOfGun, 16 Oct 2012
    Last edited: 16 Oct 2012
  5. Chrome~

    Chrome~ Elder - Старейшина

    Joined:
    13 Dec 2008
    Messages:
    936
    Likes Received:
    162
    Reputations:
    27
    После 4 лет? Печально.
    ТС, не выдумывай свой стиль, а придерживайся уже существующих.
    http://ru.wikipedia.org/wiki/Отступ_(программирование)
     
    #5 Chrome~, 16 Oct 2012
    Last edited: 16 Oct 2012
  6. GRRRL Power

    GRRRL Power Elder - Старейшина

    Joined:
    13 Jul 2010
    Messages:
    823
    Likes Received:
    185
    Reputations:
    84
    realcoder, это же какой-то хардкор. Ни пробелов, ни адекватных отступов. Комменты расположены жутко. Си смешан с С++, кстати. Тут у меня только три варианта - либо ты ничему не научился за свои четыре года, либо не умеешь юзать функции автоформатирования во всех более-менее приличных IDE, либо ты толстый тролль (что скорее всего).
     
  7. FunOfGun

    FunOfGun Elder - Старейшина

    Joined:
    5 Sep 2012
    Messages:
    388
    Likes Received:
    72
    Reputations:
    124
    Сиесняюсь спросить, а почему часть тел ф-ций выделено дополнительным табом, а часть нет? Весь код сдвинут вправо на таб и часть тел ф-ций выделено 1-м(!) пробелом.
    Вот это еще порабовало:
    Code:
     return (connect(s,(sockaddr *)&sa,sizeof(sa))==0)?true:false;
    Если выражение истинно, вернуть истину, в противном случае вернуть ложь...
    П.С. это я пишу думая, что автор выложил код для того, что бы его прокоментировали и показали ошибки.
     
    #7 FunOfGun, 16 Oct 2012
    Last edited: 16 Oct 2012
  8. D4rkC10ud

    D4rkC10ud New Member

    Joined:
    30 Jul 2012
    Messages:
    27
    Likes Received:
    1
    Reputations:
    0
    А мой код иногда выглядит так:)

    Code:
    __declspec(naked) HANDLE __stdcall GetKernel32_x86(){ 
        __asm{ 
            db 064h, 0A1h, 030h, 000h, 000h, 000h, 08Bh, 040h, 00Ch, 08Bh, 040h, 01Ch, 08Bh, 000h, 08Bh, 040h, 008h, 0C3h }
     }
    
     
  9. Zombi ****

    Zombi **** Elder - Старейшина

    Joined:
    4 Apr 2009
    Messages:
    166
    Likes Received:
    183
    Reputations:
    17
    нашел чем хвастаться!
     
  10. Spot

    Spot Elder - Старейшина

    Joined:
    1 Mar 2007
    Messages:
    461
    Likes Received:
    38
    Reputations:
    1
    У нас был целый свод правил по оформлению кода: название функций, переменных, свойств и т.п. . Впринципе и в дальнейшем придерживаюсь, если надо, что- то большое, а не 100СтрочекСкрипт.

    PHP:
            /// <summary>
            /// Parset einen dia-XML-string. (Tabellenname, Variablenname, Variablentype, Beziehungen)
            /// </summary>
            /// <param name="xmlContent">Der XML Inhalt.</param>
            /// <returns>Die Liste der ausgelesenen Tabellen.</returns>
            
    private DiaContent ParseXml(string xmlContent)
            {
                
    XmlDocument xmldoc = new XmlDocument();
                try
                {
                    
    xmldoc.LoadXml(xmlContent);
                }
                catch (
    Exception ex) { MessageBox.Show(ex.Message"Fehler"MessageBoxButton.OKMessageBoxImage.Warning); }
          
                List<
    Tabletables = new List<Table>();
                List<
    ReferencePropertysreferences = new List<ReferencePropertys>();

                
    XmlNamespaceManager xmlnsManager = new XmlNamespaceManager(xmldoc.NameTable);
                
    xmlnsManager.AddNamespace("dia""http://www.lysator.liu.se/~alla/dia/");
                
    XmlNodeList diaObjects xmldoc.SelectNodes("//dia:object"xmlnsManager);

                foreach (
    XmlNode diaObject in diaObjects)
                {
                    if (
    diaObject.Attributes["type"].Value == "Database - Table")    //Suche nach Tabellen und Tabellen Variablen.
                    
    {
                        
    Table table = new Table();
                        
    int AttrNumberID 12;    //Erste Variable in der Tabelle beginnt mit Attributnummer 12.
                        
    int tableId;
                        
    int.TryParse(diaObject.Attributes["id"].Value.Replace("O"""), out tableId);
                        
    table.Id tableId;

                        foreach (
    System.Xml.XmlNode attr in diaObject.ChildNodes)
                        {
                            if (
    attr.Attributes["name"].Value != null && attr.Attributes["name"].Value == "name")
                            {
                                if (
    attr.FirstChild.Name == "dia:string")
                                    
    table.Name attr.FirstChild.InnerText.Replace("#""");
                            }
                            else
                            {
                                foreach (
    XmlNode comp in attr.ChildNodes)
                                {
                                    if (
    comp.Name == "dia:composite" && comp.Attributes["type"].Value == TableColumn)
                                    {
                                        
    TableColumn column = new TableColumn(table);

                                        foreach (
    XmlNode compAttr in comp.ChildNodes)
                                        {
                                            
    string checkAttr;
                                            
    checkAttr compAttr.Attributes["name"].Value;

                                            switch (
    checkAttr)
                                            {
                                                case 
    "comment":
                                                    break;
                                                case 
    "name":    //Suche Nach Variablennamen
                                                    
    if (compAttr.FirstChild.Name == "dia:string")
                                                    {
                                                        
    column.Name compAttr.FirstChild.InnerText.Replace("#""");
                                                        if (
    column.Name == "")
                                                        {
                                                            
    column.IsOkey false;
                                                            
    MessageBox.Show("In der Tabelle <<" table.Name ">> wurde ein Variable ohne Name gefunden!""Struktur Fehler aufgetreten."MessageBoxButton.OKMessageBoxImage.Information);
                                                        }
                                                        else 
    column.IsOkey true;
                                                    }
                                                    break;
                                                case 
    "type":   //Suche nach Variablentyp
                                                    
    if (compAttr.FirstChild.Name == "dia:string")
                                                    {
                                                        
    column.Type compAttr.FirstChild.InnerText.Replace("#""");
                                                        if (
    column.Type == "")
                                                        {
                                                            
    /*Dispatcher.CurrentDispatcher.Invoke(new Action(() =>
                                                                {
                                                                    Korrektur fenster = new Korrektur();
                                                                    fenster.ShowDialog();
                                                                })); */
                                                            
    column.IsOkey false;
                                                        }
                                                        else 
    column.IsOkey true;
                                                    }

                                                    break;
                                                case 
    "primary_key":       //Suche nach Primarykey
                                                    
    if (compAttr.FirstChild.Name == "dia:boolean")
                                                    {
                                                        try
                                                        {
                                                            
    bool isPk;
                                                            
    bool.TryParse(compAttr.FirstChild.Attributes["val"].Valueout isPk);
                                                            
    column.IsPrimaryKey isPk;
                                                        }
                                                        catch (
    Exception b)
                                                        {
                                                            
    MessageBox.Show(b.Message);
                                                        }
                                                    }
                                                    break;
                                                case 
    "nullable"//Suche nach Nullabilität
                                                    
    if (compAttr.FirstChild.Name == "dia:boolean")
                                                    {
                                                        try
                                                        {
                                                            
    bool isNullable;
                                                            
    bool.TryParse(compAttr.FirstChild.Attributes["val"].Valueout isNullable);
                                                            
    column.IsNullable isNullable;
                                                        }
                                                        catch (
    Exception n)
                                                        {
                                                            
    MessageBox.Show(n.Message);
                                                        }
                                                    }
                                                    break;
                                                case 
    "unique":     //Suche nach Unique-Key
                                                    
    if (compAttr.FirstChild.Name == "dia:boolean")
                                                    {
                                                        try
                                                        {
                                                            
    bool isUnique;
                                                            
    bool.TryParse(compAttr.FirstChild.Attributes["val"].Valueout isUnique);
                                                        }
                                                        catch (
    Exception ex)
                                                        {
                                                            
    MessageBox.Show(ex.Message);
                                                        }
                                                    }
                                                    break;
                                            }
                                        }
                                        
    column.AttrLeftId AttrNumberID;
                                        
    column.AttrRightId AttrNumberID 1;
                                        
    table.Columns.Add(column);
                                        
    AttrNumberID += 2;
                                    }
                                }
                            }
                        }
                        
    tables.Add(table);
                    }
                    else if (
    diaObject.Attributes["type"].Value == "Database - Reference")    //Suche Nach Beziehungen zur anderen Tabellen.
                    
    {
                        
    ReferencePropertys property = new ReferencePropertys();

                        
    int referenceTableId;
                        
    int.TryParse(diaObject.Attributes["id"].Value.Replace("O"""), out referenceTableId);
                        
    property.ReferenceTableId referenceTableId;

                        foreach (
    XmlNode Connections in diaObject.ChildNodes)
                        {
                            if (
    Connections.FirstChild.Name == "dia:connection")
                            {
                                
    SplittReference reference = new SplittReference();

                                foreach (
    XmlNode Params in Connections.ChildNodes)     //Beziehungen zur anderen Tabellen.
                                
    {
                                    if (
    Params.Attributes["handle"].Value == "0")  // handle == 0  -> FROM
                                    
    {
                                        
    int fromTableId;
                                        
    int.TryParse(Params.Attributes["to"].Value.Replace("O"""), out fromTableId);
                                        
    reference.FromTableID fromTableId;

                                        
    int fromTableVarId;
                                        
    int.TryParse(Params.Attributes["connection"].Valueout fromTableVarId);
                                        
    reference.FromTableVarID fromTableVarId;

                                    }
                                    else if (
    Params.Attributes["handle"].Value == "1"// handle == 1 -> TO
                                    
    {
                                        
    int toTableId;
                                        
    int.TryParse(Params.Attributes["to"].Value.Replace("O"""), out toTableId);
                                        
    reference.ToTableID toTableId;

                                        
    int toTableVarId;
                                        
    int.TryParse(Params.Attributes["connection"].Valueout toTableVarId);
                                        
    reference.ToTableVarID toTableVarId;
                                    }
                                }
                                
    property.ReferenceParams.Add(reference);
                            }
                        }
                        
    references.Add(property);
                    }
                }

                
    FromIdToName(referencestables);
                return new 
    DiaContent(tables);
            }


     
    #10 Spot, 17 Oct 2012
    Last edited: 17 Oct 2012
  11. greki_hoy

    greki_hoy Member

    Joined:
    4 Mar 2010
    Messages:
    326
    Likes Received:
    57
    Reputations:
    41
    void (* _handler) (void *,int);//обработчик поступления новых данных

    хм а если подписчиков несколько ? а если подписчик - метод класса ?

    посему тут уместно было бы заюзать boost::signals2 который управляет очередью
    подписчиков и boost::function чтобы можно было передавать как глобальные
    функции так и методы классов этакий generic делегат

    тут пример: http://rakafon.blogspot.de/2009/04/boostsignals.html

    int revcdata(void *bufer,int size);

    зачем клиенту этот головняк ? я еще понимаю в реализации повыделаться с
    указателями но в интерфейсе... намного лучше std::vector<byte>


    void *buffer=malloc(size);
    buffer=realloc(buffer,size);
    free(buffer);

    аналогично подлежит выпилу мало того что код увеличивает так еще следить за буфером самому надо

    а вообще решить твою задачу более красиво и самое главное быстро мог бы C++/CLI там и event встроенные и сборщик мусора и огромная библиотека и интеграция с нативным кодом отменная фактически можеш смешивать в одной программе asm & c++ & c++/cli (.net)

    зачем это ?
    const size_t size_delta=128;//получаем по 128 байт

    лучше так

    ждем евента на чтение
    select(read_set)

    узнаем сколько байт пришло
    WSAIoctl с флагом FIONREAD

    читаем
    WSARecv

    вот утилитка для отслеживания сокетов когда то писал
    http://www.fayloobmennik.net/2284722
     
    #11 greki_hoy, 17 Oct 2012
    Last edited: 17 Oct 2012
  12. greki_hoy

    greki_hoy Member

    Joined:
    4 Mar 2010
    Messages:
    326
    Likes Received:
    57
    Reputations:
    41
    2Spot

    кстати не гуд такие огромные функции делать
     
  13. Chrome~

    Chrome~ Elder - Старейшина

    Joined:
    13 Dec 2008
    Messages:
    936
    Likes Received:
    162
    Reputations:
    27
    А чем огромные функции не нравятся?
     
  14. login999

    login999 Elder - Старейшина

    Joined:
    12 Jun 2008
    Messages:
    491
    Likes Received:
    280
    Reputations:
    92
    http://ru.wikipedia.org/wiki/Декомпозиция
    Считается хорошим тоном. Проще рефакторить.
     
  15. Spot

    Spot Elder - Старейшина

    Joined:
    1 Mar 2007
    Messages:
    461
    Likes Received:
    38
    Reputations:
    1
    greki_hoy,login999

    Кусок кода из проекта, где пониманиие кода для дальнейшего использования и преобразования стояло на первом месте. Если детально разобрать его, то вы увидите, что метод является "one way", то есть идёт работа с документом от начала и до конца, прогоняя по заданным критериям. Такой метод намного более понятен, чем дробление его на мелкие подвызовы по типу "разделяй и властвуй" (если провести грубую аналогию). Раз уж был приведён пример на вики, то процитирую написаное там :
    "Степень подробности описания и количество уровней определяются требованиями обозримости и удобства восприятия получаемой иерархической структуры, её соответствия уровням знания работающему с ней специалисту."
    Как писал выше - акцент делался на быстрое введение в код.

    P.S. По поводу "громадности" - не видели вы действительно громадных.
     
  16. greki_hoy

    greki_hoy Member

    Joined:
    4 Mar 2010
    Messages:
    326
    Likes Received:
    57
    Reputations:
    41
    я люблю когда функции небольшие в которых логика на ладони а тут три экрана мне надо скроллить чтобы посмотреть другие условия я бы подветки if вынес в отдельные функции а в главной сделал свитч с выбором функции

    а изменять вы пробовали огромные функции это пиздец... придется час сидеть вдуплять как ее изменить чтобы ничего не расклеилось да и ошибку внести намного проще
     
    #16 greki_hoy, 19 Oct 2012
    Last edited: 19 Oct 2012
  17. inCode

    inCode Member

    Joined:
    20 Jun 2011
    Messages:
    141
    Likes Received:
    22
    Reputations:
    5
    1)учится использовать LINQ
    2)обработка исключений в отдельную функцию
    3)не злоупотреблять try{}catch{} , а так же это

    http://stackoverflow.com/questions/10805987/catch-vs-catch-exception-e-and-throw-vs-throw-e

    4)в атрибуты передавать переменные, а не статические значения
     
  18. Spot

    Spot Elder - Старейшина

    Joined:
    1 Mar 2007
    Messages:
    461
    Likes Received:
    38
    Reputations:
    1
    Вот за что я "люблю" русскоязычные айти-форумы, так это за то, что каждый считает себя в каждой дырке затычка. Дорогие товарищи, внимательно читайте тему - разговор об оформлении кода, как пример. Неужели нужно обьяснять каждому почему написано было именно так, а не иначе? Не спешите делать свои выводы увидев лишь малую часть кода и не зная требований тимлида.

    Не старайтесь показаться умнее давая советы, но при этом не видя картины в целиком.

    P.S. специально для InCode, ещё кусок из проекта:

    Code:
    		/// <summary>
    		/// Parsen von Beziehungen und speichern dieser.
    		/// </summary>
    		/// <param name="references"></param>
    		/// <param name="tables"></param>
    		private void FromIdToName(List<ReferencePropertys> references, List<Table> tables)
    		{
    			foreach (ReferencePropertys refProp in references)
    			{
    				foreach (SplittReference splittRef in refProp.ReferenceParams)
    				{
    					Table fromTable = (from ftl in tables where ftl.Id == splittRef.FromTableID select ftl).FirstOrDefault();
    					if (fromTable == null)
    						continue;
    
    					TableColumn fromColumn = (from ftvl in fromTable.Columns where ftvl.AttrLeftId == splittRef.FromTableVarID || ftvl.AttrRightId == splittRef.FromTableVarID select ftvl).FirstOrDefault();
    					if (fromColumn == null)
    						continue;
    
    					Table toTable = (from ftlp in tables where ftlp.Id == splittRef.ToTableID select ftlp).FirstOrDefault();
    					if (toTable == null)
    						continue;
    
    					TableColumn toColumn = (from ttv in toTable.Columns where ttv.AttrLeftId == splittRef.ToTableVarID || ttv.AttrRightId == splittRef.ToTableVarID select ttv).FirstOrDefault();
    					if (toColumn == null)
    						continue;
    
    					fromColumn.ForeignKey = toColumn;
    				}
    			}
    		}
    
    Я повторюсь - не спеши, советовать и исправлять не видя полной картины.
     
    #18 Spot, 19 Oct 2012
    Last edited: 19 Oct 2012
  19. Белый Ворон

    Joined:
    7 Oct 2012
    Messages:
    46
    Likes Received:
    3
    Reputations:
    0
    Spot у тебя орфографические ошибки в коде ))