я после 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, &fd, NULL, NULL, NULL);//проверяем, нет пришли ли на сокет данные 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>0) bDataFlag=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);//создаем поток проверки состояния сокета } выкладывайте куски своих проектов
Бью код на логические блоки и распихиваю по методам, в методах юзаю пустые строки как разделители, коменты вообще не юзаю(стараюсь писать так, что бы код сам был наглядным коментом). П.С. все остальное делает Visual Studio
После 4 лет? Печально. ТС, не выдумывай свой стиль, а придерживайся уже существующих. http://ru.wikipedia.org/wiki/Отступ_(программирование)
realcoder, это же какой-то хардкор. Ни пробелов, ни адекватных отступов. Комменты расположены жутко. Си смешан с С++, кстати. Тут у меня только три варианта - либо ты ничему не научился за свои четыре года, либо не умеешь юзать функции автоформатирования во всех более-менее приличных IDE, либо ты толстый тролль (что скорее всего).
Сиесняюсь спросить, а почему часть тел ф-ций выделено дополнительным табом, а часть нет? Весь код сдвинут вправо на таб и часть тел ф-ций выделено 1-м(!) пробелом. Вот это еще порабовало: Code: return (connect(s,(sockaddr *)&sa,sizeof(sa))==0)?true:false; Если выражение истинно, вернуть истину, в противном случае вернуть ложь... П.С. это я пишу думая, что автор выложил код для того, что бы его прокоментировали и показали ошибки.
А мой код иногда выглядит так 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 } }
У нас был целый свод правил по оформлению кода: название функций, переменных, свойств и т.п. . Впринципе и в дальнейшем придерживаюсь, если надо, что- то большое, а не 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.OK, MessageBoxImage.Warning); } List<Table> tables = new List<Table>(); List<ReferencePropertys> references = 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.OK, MessageBoxImage.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"].Value, out 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"].Value, out 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"].Value, out 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"].Value, out 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"].Value, out toTableVarId); reference.ToTableVarID = toTableVarId; } } property.ReferenceParams.Add(reference); } } references.Add(property); } } FromIdToName(references, tables); return new DiaContent(tables); }
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
greki_hoy,login999 Кусок кода из проекта, где пониманиие кода для дальнейшего использования и преобразования стояло на первом месте. Если детально разобрать его, то вы увидите, что метод является "one way", то есть идёт работа с документом от начала и до конца, прогоняя по заданным критериям. Такой метод намного более понятен, чем дробление его на мелкие подвызовы по типу "разделяй и властвуй" (если провести грубую аналогию). Раз уж был приведён пример на вики, то процитирую написаное там : "Степень подробности описания и количество уровней определяются требованиями обозримости и удобства восприятия получаемой иерархической структуры, её соответствия уровням знания работающему с ней специалисту." Как писал выше - акцент делался на быстрое введение в код. P.S. По поводу "громадности" - не видели вы действительно громадных.
я люблю когда функции небольшие в которых логика на ладони а тут три экрана мне надо скроллить чтобы посмотреть другие условия я бы подветки if вынес в отдельные функции а в главной сделал свитч с выбором функции а изменять вы пробовали огромные функции это пиздец... придется час сидеть вдуплять как ее изменить чтобы ничего не расклеилось да и ошибку внести намного проще
1)учится использовать LINQ 2)обработка исключений в отдельную функцию 3)не злоупотреблять try{}catch{} , а так же это http://stackoverflow.com/questions/10805987/catch-vs-catch-exception-e-and-throw-vs-throw-e 4)в атрибуты передавать переменные, а не статические значения
Вот за что я "люблю" русскоязычные айти-форумы, так это за то, что каждый считает себя в каждой дырке затычка. Дорогие товарищи, внимательно читайте тему - разговор об оформлении кода, как пример. Неужели нужно обьяснять каждому почему написано было именно так, а не иначе? Не спешите делать свои выводы увидев лишь малую часть кода и не зная требований тимлида. Не старайтесь показаться умнее давая советы, но при этом не видя картины в целиком. 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; } } } Я повторюсь - не спеши, советовать и исправлять не видя полной картины.