Здравствуйте, YetAnotherOne, Вы писали:
YAO>Как вы считаете, является ли данный класс говнокодом? Если бы вам предложили поддерживать проект с подобным кодом, вы бы были в восторге или огорчились бы? По сравнению с качеством кода в вашей конторе хуже или лучше? Во сколько бы оценили по 5-ти бальной шкале?
Это просто конфетка по сравнению с тем, с чем приходится работать. Поставил бы твердую 4+.
19.08.2011 18:55, elmal пишет:
> Тут интересный вопрос. Свой худший код, который писался часто в ASAP > режиме я оцениваю на 3 или 3- (копипасту я даже в ASAP режиме не > допускаю, бывает спускаюсь и ниже удовлетворительного, но в таком > состоянии код живет не больше недели, потом меня совесть замучит). > Максимальную оценку себе я выше 4 еще не ставил.
Ты бы свой код сюда выложил. Мы бы посмотрели, обос... обсудили.
Здравствуйте, YetAnotherOne, Вы писали:
L>>Это просто конфетка по сравнению с тем, с чем приходится работать. Поставил бы твердую 4+.
YAO>Вы не шутите? То есть вы считаете, что это вполне нормально:
А я смысл не читал, только код посмотрел.
И таки-да, по сравнению с тем, с чем приходится работать, код-таки конфетка.
Здравствуйте, YetAnotherOne, Вы писали:
YAO>Как вы считаете, является ли данный класс говнокодом?
Мммм... няма! Руки чешутся отрефакторить.
А ведь с настоящим говонкодом вместо желания рефакторить возникает стойкое желание выкинуть и написать заново.
Так что пациент скорее жив чем мертв, поставлю 4
-----
Любимая фраза физика-теоретика: "Вот видите, мы ошиблись всего лишь на порядок".
Здравствуйте, YetAnotherOne, Вы писали:
YAO>Как вы считаете, является ли данный класс говнокодом? Если бы вам предложили поддерживать проект с подобным кодом, вы бы были в восторге или огорчились бы? По сравнению с качеством кода в вашей конторе хуже или лучше? Во сколько бы оценили по 5-ти бальной шкале?
Не понимаю, что заставляет людей так думать и писать. Может язык совместно с фрэймворком? Не понимаю, зачем объединять поток и структуру запроса/ответа в один класс. Может только чтобы потом написать application.run().
Оценку ставить не берусь, пока кто-нибудь не объяснит где это так надо.
Здравствуйте, Lloyd, Вы писали:
L>Это просто конфетка по сравнению с тем, с чем приходится работать. Поставил бы твердую 4+.
Вы не шутите? То есть вы считаете, что это вполне нормально:
1. Поведение. Что это за класс вообще? Вроде Stream (HttpStream), но по сути дела никакой не Stream, а скорее Reader. И то сомнительно -- т.к. в нем и заголовки, и тело запроса в виде строки. Поведение размазано.
2. Парсить в этом Stream HTTP-заголовки (хотя есть класс HttpHeaders, HttpRequestHeaders, HttpResponseHeaders):
Вот:
var contentType = _headers["Content-Type"];
if (!string.IsNullOrWhiteSpace(contentType))
{
foreach (var section in contentType.Split(';'))
{
var parts = section.Split('=');
var name = parts[0].Trim();
switch (name.ToLowerInvariant())
{
case"charset":
BodyEncoding = Encoding.GetEncoding(parts[1].Trim());
break;
}
}
}
и вот:
var isChunked = false;
var chunked = _headers["Transfer-Encoding"];
if (!string.IsNullOrWhiteSpace(chunked))
{
isChunked = true;
}
и вот:
var contentEncoding = _headers["Content-Encoding"];
if (!string.IsNullOrWhiteSpace(contentEncoding))
{
switch (contentEncoding)
{
case"gzip":
...
break;
case"deflate":
...
break;
3. Вот такая конструкция:
return new HttpStream(streamReader, new HttpRequestHeaders(streamReader));
как вам? То есть в HttpStream парсим заголовки, а в HttpRequestHeaders и HttpResponseHeaders читаем поток.
4. При чтении в методе readBody закрываем основной поток. При этом иногда он будет закрыт, а иногда нет:
using (var bodyReader = new StreamReader(stream, BodyEncoding ?? Encoding.UTF8))
5. Как вам функция deChunkeToNewStream? Не находите, что это можно написать намного проще?
6. Как вам функция setPositionToBody? И вообще насколько она уместна, если после заголовка всегда идет body?
Я все таки надеюсь что вы не вдавались в подробности. Неужели и вы так пишите (вроде как у вас неплохая подборка званий)?
Здравствуйте, YetAnotherOne, Вы писали:
YAO>Как вы считаете, является ли данный класс говнокодом? Если бы вам предложили поддерживать проект с подобным кодом, вы бы были в восторге или огорчились бы? По сравнению с качеством кода в вашей конторе хуже или лучше? Во сколько бы оценили по 5-ти бальной шкале?
YAO>Код:
В логику сильно не вникал. На первый взгляд — обычный, нормальный код. Оценка 4+
Здравствуйте, YetAnotherOne, Вы писали:
YAO>Как вы считаете, является ли данный класс говнокодом? Если бы вам предложили поддерживать проект с подобным кодом, вы бы были в восторге или огорчились бы? По сравнению с качеством кода в вашей конторе хуже или лучше? Во сколько бы оценили по 5-ти бальной шкале?
YAO>Код:
YAO>
YAO>
1. Если говорить про качество кода на уровне функции, то это очень хороший код — исключения и работа с ресурсами на месте, всё однообразно в соответствии с некоторыми правилами оформления кода. При желании можно быстро понять и разобраться. 4 из 5.
2. Если смотреть на класс сверху и начинать придиратся, то ни разу не Stream никакой. Да и закрытая readBody(), которая только в конструкторе дергается никак тестированию не поддается. Но на самом деле это — мелочи, которые наоборот только тянет улучшить, но никак не бежать в панике от этого кода, если таковой достанется.
Здравствуйте, YetAnotherOne, Вы писали:
YAO>Как вы считаете, является ли данный класс говнокодом? Если бы вам предложили поддерживать проект с подобным кодом, вы бы были в восторге или огорчились бы? По сравнению с качеством кода в вашей конторе хуже или лучше? Во сколько бы оценили по 5-ти бальной шкале?
Я бы сказал что структура кода конечно не лучшая, видно полное несоблюдение SOLID, функции имееют по 5-8 ответственностей. Но в целом код поддётся простому рефакторингу. По 5-ти бальной системе поставил бы твёрдую 3-ку.
Здравствуйте, catBasilio, Вы писали:
B>Здравствуйте, DorfDepp, Вы писали:
DD>>Здравствуйте, YetAnotherOne, Вы писали:
DD>>Увольнять любого, кто пишет код и комментарии не на английском.
B>А что не так с комметариями? По опыту могу сказать что так как девелоперы — народ русскоязычный то в цепочке
Кстати, это тема! Надо всем договориться писать коментарии тока на русском языке, тогда другим поддерживать наш код будет труднее и спрос на русских разрабов вырастет.
Как вы считаете, является ли данный класс говнокодом? Если бы вам предложили поддерживать проект с подобным кодом, вы бы были в восторге или огорчились бы? По сравнению с качеством кода в вашей конторе хуже или лучше? Во сколько бы оценили по 5-ти бальной шкале?
Код:
public class HttpStream
{
private readonly HttpHeaders _headers;
private readonly string _body;
internal HttpHeaders Headers
{
get { return _headers; }
}
[CanBeNull]
internal string Body
{
get { return _body; }
}
[CanBeNull]
internal Encoding BodyEncoding { get; private set; }
private HttpStream(StreamReader streamReader, HttpHeaders httpHeaders)
{
if (streamReader == null)
throw new ArgumentNullException("streamReader");
if (httpHeaders == null)
throw new ArgumentNullException("httpHeaders");
_headers = httpHeaders;
_body = readBody(streamReader);
}
internal static HttpStream ParseRequest(StreamReader streamReader)
{
if (streamReader == null)
throw new ArgumentNullException("streamReader");
return new HttpStream(streamReader, new HttpRequestHeaders(streamReader));
}
internal static HttpStream ParseResponse(StreamReader streamReader)
{
if (streamReader == null)
throw new ArgumentNullException("streamReader");
return new HttpStream(streamReader, new HttpResponseHeaders(streamReader));
}
private string readBody(StreamReader streamReader)
{
var contentType = _headers["Content-Type"];
if (!string.IsNullOrWhiteSpace(contentType))
{
foreach (var section in contentType.Split(';'))
{
var parts = section.Split('=');
var name = parts[0].Trim();
switch (name.ToLowerInvariant())
{
case"charset":
BodyEncoding = Encoding.GetEncoding(parts[1].Trim());
break;
}
}
}
var isChunked = false;
var chunked = _headers["Transfer-Encoding"];
if (!string.IsNullOrWhiteSpace(chunked))
{
isChunked = true;
}
Stream compressedStream = null;
Stream deChunkedStream = null;
try
{
var stream = streamReader.BaseStream;
setPositionToBody(stream);
if (isChunked)
{
stream = deChunkeToNewStream(stream);
deChunkedStream = stream;
stream.Position = 0;
}
var contentEncoding = _headers["Content-Encoding"];
if (!string.IsNullOrWhiteSpace(contentEncoding))
{
switch (contentEncoding)
{
case"gzip":
stream = new GZipStream(stream, CompressionMode.Decompress, true);
compressedStream = stream;
break;
case"deflate":
stream = new DeflateStream(stream, CompressionMode.Decompress, true);
compressedStream = stream;
break;
default:
try
{
// путают настройщики серверов Content-Encoding с Content-Typevar dummyEncoding = Encoding.GetEncoding(contentEncoding);
if (BodyEncoding == null)
BodyEncoding = dummyEncoding;
}
catch (ArgumentException)
{
throw new InvalidOperationException("Не известное значение заголовка Content-Encoding:" +
contentEncoding);
}
break;
}
}
using (var bodyReader = new StreamReader(stream, BodyEncoding ?? Encoding.UTF8))
{
return bodyReader.ReadToEnd();
}
}
finally
{
if (deChunkedStream != null)
{
deChunkedStream.Dispose();
}
if (compressedStream != null)
{
compressedStream.Dispose();
}
}
}
private static Stream deChunkeToNewStream(Stream stream)
{
var hexSize = string.Empty;
Stream resStream = new MemoryStream();
int readed;
do
{
var buf = new byte[1];
readed = stream.Read(buf, 0, 1);
if (readed == 1 && buf[0] == 13)
{
readed = stream.Read(buf, 0, 1);
if (readed == 1 && buf[0] == 10)
{
// копируем тело чанка в результирующий потокvar chunkSize = int.Parse(hexSize, NumberStyles.AllowHexSpecifier);
var chunkBuf = new byte[chunkSize];
readed = stream.Read(chunkBuf, 0, chunkSize);
if (readed != chunkSize)
{
throw new InvalidOperationException(
string.Format("Ошибка чтения. Ожидалось байт: {0}; Получено: {1}", chunkSize, readed));
}
resStream.Write(chunkBuf, 0, chunkSize);
hexSize = string.Empty;
// пропускаем CRLF, идущий после каждого чанка
readed = stream.Read(buf, 0, 1);
if (readed == 1 && buf[0] == 13)
{
readed = stream.Read(buf, 0, 1);
if (readed == 1 && buf[0] == 10)
{
continue;
}
}
throw new InvalidOperationException("Чанк не оканчивается на #13#10");
}
throw new InvalidOperationException("Не ожиданный символ #13, без последующего #10");
}
hexSize += (char) buf[0];
} while (readed > 0);
return resStream;
}
private static void setPositionToBody(Stream stream)
{
stream.Position = 0;
var buf = new byte[1];
int readed;
do
{
// читаем до 2 подряд идущих CRLF
readed = stream.Read(buf, 0, 1);
if (readed != 1 || buf[0] != 13)
{
continue;
}
readed = stream.Read(buf, 0, 1);
if (readed != 1 || buf[0] != 10)
{
continue;
}
readed = stream.Read(buf, 0, 1);
if (readed != 1 || buf[0] != 13)
{
continue;
}
readed = stream.Read(buf, 0, 1);
if (readed == 1 && buf[0] == 10)
{
return;
}
} while (readed > 0);
}
}
Здравствуйте, YetAnotherOne, Вы писали:
YAO>Как вы считаете, является ли данный класс говнокодом? Если бы вам предложили поддерживать проект с подобным кодом, вы бы были в восторге или огорчились бы? По сравнению с качеством кода в вашей конторе хуже или лучше? Во сколько бы оценили по 5-ти бальной шкале?
Тут интересный вопрос. Свой худший код, который писался часто в ASAP режиме я оцениваю на 3 или 3- (копипасту я даже в ASAP режиме не допускаю, бывает спускаюсь и ниже удовлетворительного, но в таком состоянии код живет не больше недели, потом меня совесть замучит). Максимальную оценку себе я выше 4 еще не ставил. А на код, которому можно 5 поставить, я бы просто хотел бы посмотреть — всегда есть простор к улучшению .
Уроверь писавшего оцениваю как юниорский. Код бы я оценил на 2, то есть неудовлетворительно, но не смертельно. Тт человека, с опытом меньше двух лет, как показывает практика, лучшего кода ожидать бессмысленно. Это не такая плохая оценка, худший код, который я видел, я б оценил в 0 из 5 (писали американские студенты). А этот можно довольно быстро привести к удовлетворительному состоянию, если поизбавляться от некоторой копипасты, сократить и повысить понятность можно легко, более глубоко даже лень смотреть пока не отрефакторю.
Предполагаю, что это код тестового задания. Соответственно студента, сильному в теории и написавшего подобный код я бы взял на юниора, переучить можно. Если б такое написал кто-то, претендующий на хорошего разработчика — извините, есть куча других контор, которых этот код удовлетворит в полной мере (да там и кодировать не попросят, максимум на бумажке, где по нормальному один хрен не напишешь), у нас он просто не впишется в коллектив.
Если бы мне предложили поддерживать проект с подобным кодом за 200 тысяч в месяц я б обрадовался. За 120 тысяч я б подумал. За 100 тысяч — твердо б не согласился. Но в конторах с таким кодом мне и 50 не предложат .
Здравствуйте, YetAnotherOne, Вы писали:
YAO>Как вы считаете, является ли данный класс говнокодом? Если бы вам предложили поддерживать проект с подобным кодом, вы бы были в восторге или огорчились бы? По сравнению с качеством кода в вашей конторе хуже или лучше? Во сколько бы оценили по 5-ти бальной шкале?
Троечка. В принципе это код хорошего джуниора
Re[2]: А слабо этот говнокод превратить в конфетку?
Здравствуйте, boot, Вы писали:
B>Не понимаю, что заставляет людей так думать и писать. Может язык совместно с фрэймворком? Не понимаю, зачем объединять поток и структуру запроса/ответа в один класс. Может только чтобы потом написать application.run().
Потому что для джуниоров
1 это предельно наглядно, т.к. все еще слабо решают задачи, что бы делать это в уме, соответсвенно код своего рода черновик
2 еще не научились декомпозиции, например выделять определенные обязанности
3 не понимают все имеющиеся проблемы в таком коде
4 не правильно оценивают важность известных им проблем
YAO>Как вы считаете, является ли данный класс говнокодом? Если бы вам предложили поддерживать проект с подобным кодом, вы бы были в восторге или огорчились бы? По сравнению с качеством кода в вашей конторе хуже или лучше? Во сколько бы оценили по 5-ти бальной шкале?
Код не очень хорош, есть замечания и по стилю, и по структуре, и по реализации. Но приходилось работать и с намного более плохим кодом, так что все не очень страшно. 4-
Здравствуйте, Vzhyk, Вы писали:
V>Ты бы свой код сюда выложил. Мы бы посмотрели, обос... обсудили.
Код проекта, увы, выкладывать нет желания на всеобщее обозрение. А код проваленного простого тестового задания, на который даже фидбека никакого не получил, как то даже выкладывал здесь
.
Здесь ИМХО ближе к 4-м, старался.
Ну а ASAP реализация одной специфичной задачи, которую оцениваю сам на 3-, и которую возможно потребуется полность переписать или вообще выкинуть (скорее второе):
/**
* Заточенный под поиск свой велосипед. Позволяет искать следующий и предыдущий открытый тег с любого
* места как вперед, так и назад. Собственно даже не XML здесь ищется, а любые теги
*/public class CustomXMLParser {
public TagPosition findPreviousTag(String content, int startPosition) {
return findPreviousTag(content, startPosition, 1);
}
public TagPosition findPreviousTag(String content, int startPosition, int neededToFindOpenTags) {
TagPosition tag = null;
int currentPosition = startPosition;
while (neededToFindOpenTags > 0) {
tag = findPreviousTagPosition(content, currentPosition);
currentPosition = tag.getOpenTagPosition() - 1;
if (tag.isOpenTag()) {
neededToFindOpenTags--;
} else {
neededToFindOpenTags++;
}
}
return tag;
}
public TagPosition findNextTag(String content, int startPosition) {
int neededToFindCloseTags = 1;
TagPosition tag = null;
int currentPosition = startPosition;
while (neededToFindCloseTags > 0) {
tag = findNextTagPosition(content, currentPosition);
currentPosition = tag.getCloseTagPosition() + 1;
if (tag.isOpenTag()) {
neededToFindCloseTags++;
} else {
neededToFindCloseTags--;
}
}
return tag;
}
private TagPosition findPreviousTagPosition(String content, int startPosition) {
TagPosition result = new TagPosition();
result.setOpenTagPosition(0);
result.setCloseTagPosition(startPosition);
boolean found = false;
for (int i = startPosition; i > 0; --i) {
char chr = content.charAt(i);
if (chr == '>') {
result.setCloseTagPosition(i);
if (content.charAt(i - 1) != '/') {
found = true;
}
}
if (chr == '<') {
result.setOpenTagPosition(i);
if (found) {
break;
}
}
}
String foundedTag = content.substring(result.getOpenTagPosition(), result.getCloseTagPosition() + 1);
if (foundedTag.contains("/")) {
result.setOpenTag(false);
} else {
result.setOpenTag(true);
}
return result;
}
private TagPosition findNextTagPosition(String content, int startPosition) {
TagPosition result = new TagPosition();
result.setOpenTagPosition(0);
result.setCloseTagPosition(startPosition);
for (int i = startPosition; i < content.length(); ++i) {
char chr = content.charAt(i);
if (chr == '>') {
result.setCloseTagPosition(i);
if (content.charAt(i - 1) != '/') {
break;
}
}
if (chr == '<') {
result.setOpenTagPosition(i);
}
}
String foundedTag = content.substring(result.getOpenTagPosition(), result.getCloseTagPosition() + 1);
if (foundedTag.contains("/")) {
result.setOpenTag(false);
} else {
result.setOpenTag(true);
}
return result;
}
}
Это пример худшего кода в проекте, хуже этого я не могу припомнить ничего. Косяков я тут сам могу до черта найти, в первую очеред копипаст дикий, а во вторых, это вообще надо все выкинуть нахрен и разбирать XML по человечески.
Здравствуйте, Доктор ТуамОсес, Вы писали:
ДТ>Здравствуйте, YetAnotherOne, Вы писали:
YAO>>Говнокод ли это? ДТ>Такие вопросы лучше завать rl=http://govnokod.ru/cpp]ТУТ[u
а причем тут с++?
Здравствуйте, YetAnotherOne, Вы писали:
YAO>Как вы считаете, является ли данный класс говнокодом? Если бы вам предложили поддерживать проект с подобным кодом, вы бы были в восторге или огорчились бы? По сравнению с качеством кода в вашей конторе хуже или лучше? Во сколько бы оценили по 5-ти бальной шкале?
YAO>Код:
С точки зрения оформления/написания (а не банально работоспособности) я оцениваю код по тому, на сколько он последователен, не противоречив.
Что видно здесь: какие-то (private) методы названы в камеле, какие-то (internal) в паскале. Это в топку. Свойство, возвращающее string и при этом которое [CanBeNull] туда-же. Строковое свойство не должно возвращать null. Вместо него надо возвращать String.Empty, что бы избавить вызывающего от не нужных проверок (а когда проверка нужна, то проверка на null и на String.IsNullOrEmpty() — не велика разница). К тому же, если свойства реализованы явно (а не автосвойствами) принято снабжать get-accessor атрибутом [DebuggerStepThrough]. Без этого не редко отладка превращается в чёрте-что.
Дальше — разбить большие методы на несколько поменьше было бы полезно: невооружённым взглядом видно, что, например, вынесение вычисления энкодинга никому не помешает. Литералы так же полезно объявить заранее в виде констант, хотя бы в самом методе. Захардкоженный текст сообщений об ошибках я ещё почему-то могу понять, если он на _английском_, но на русском такое категорически не переваривается.
Вообще, если окинуть взглядом весь класс, видно, что вся его работа заключается в том, что бы из пары (StreamReader) получить тройку (HttpHeaders, string, Encoding). При этом зачем-то используются пара статических методов и один экземплярный, который меняет поля объекта, которому принадлежит. Я бы так и написал несколько бы статических методов, которые вычисляют
HttpHeaders в зависимости от того, какая фабрика вызвана: ParseRequest или ParseResponse
Encoding по вычесленному выше HttpHeaders
string и энкодинг по стриму, хидерам и энкодингу из хидеров.
Получилось бы три независимых метода. Вызвал их по очереди (не в конструкторе), получил три переменных, после этого создавай неизменяемый объект из трёх полей и возвращай его.
Учитывая же ошибки в коде (отсутствие проверок в стриме и то, что стрим может закрыться после того, как бдует передан в этот код) ценность его чуть больше нуля.
Help will always be given at Hogwarts to those who ask for it.
Здравствуйте, Nik_1, Вы писали: N_>Здравствуйте, Доктор ТуамОсес, Вы писали: ДТ>>Такие вопросы лучше завать rl=http://govnokod.ru/cpp]ТУТ[u N_>а причем тут с++?
----------------------------
Не хотите С++ там есть гавнокод ещё на 18-ти языках
Здравствуйте, YetAnotherOne, Вы писали:
YAO>Как вы считаете, является ли данный класс говнокодом? Если бы вам предложили поддерживать проект с подобным кодом, вы бы были в восторге или огорчились бы? По сравнению с качеством кода в вашей конторе хуже или лучше? Во сколько бы оценили по 5-ти бальной шкале?
Из минусов — сообщения об ошибках и комментарии на русском языке. По остальному — по-моему, нельзя давать оценки какому-то коду без учёта условий, в которых он писался, и целей, для которых он писался. В зависимости от них, один и тот же код может быть как хорошим, так и плохим.
Здравствуйте, Lloyd, Вы писали:
L>Здравствуйте, тс, Вы писали:
тс>>Это не говнокод, это говноязык
L>да шо ви говорите! и что же в ваших краях признается за не-говно язык?
Здравствуйте, тс, Вы писали:
тс>Здравствуйте, Lloyd, Вы писали:
L>>Здравствуйте, тс, Вы писали:
тс>>>Это не говнокод, это говноязык
L>>да шо ви говорите! и что же в ваших краях признается за не-говно язык?
тс>Естессно c++11
А Вы видели исходники либов, которые пишет мелкософт на этом НЕ-говноязыке?
Здравствуйте, Доктор ТуамОсес, Вы писали:
ДТ>Тем не менее это реальный код из микрософтовского инклуда c:\Program Files\Microsoft Visual Studio\VC98\Include\COMDEF.H студии MSVC++ 6.0
Предлагаю показать мастер класс, и показать, как написать этот майкрософтовский код более коротко и понятно. Уверен, что если получится, от предложений о работе просто отбоя не будет.
Здравствуйте, elmal, Вы писали:
E>Здравствуйте, Доктор ТуамОсес, Вы писали:
ДТ>>Тем не менее это реальный код из микрософтовского инклуда c:\Program Files\Microsoft Visual Studio\VC98\Include\COMDEF.H студии MSVC++ 6.0 E>Предлагаю показать мастер класс, и показать, как написать этот майкрософтовский код более коротко и понятно. Уверен, что если получится, от предложений о работе просто отбоя не будет.
Своим сарказмом Вы, как я полагаю, хотите сказать что это невозможно?
Тогда почему Вы обиделись, когда я недвусмысленно намекнул, что с++ — это, вообще говоря гавноязык (хоть С++ программисты и являются самой многочисленной среди всех программистов группой)?
Здравствуйте, Доктор ТуамОсес, Вы писали: L>>>да шо ви говорите! и что же в ваших краях признается за не-говно язык? тс>>Естессно c++11 ДТ>А Вы видели исходники либов, которые пишет мелкософт на этом НЕ-говноязыке?
Здравствуйте, Доктор ТуамОсес, Вы писали:
ДТ>Здравствуйте, тс, Вы писали:
тс>>Здравствуйте, Lloyd, Вы писали:
L>>>Здравствуйте, тс, Вы писали:
тс>>>>Это не говнокод, это говноязык
L>>>да шо ви говорите! и что же в ваших краях признается за не-говно язык?
тс>>Естессно c++11
ДТ>А Вы видели исходники либов, которые пишет мелкософт на этом НЕ-говноязыке?
Что-то может видел.
Но зачем мелкософту c++, когда у него есть .Net
Здравствуйте, Доктор ТуамОсес, Вы писали:
ДТ>Своим сарказмом Вы, как я полагаю, хотите сказать что это невозможно?
Вот я и предлагаю показать, как это сделать. Навскидку я после 6 летнего перерыва не скажу, как написать равноценный макрос, который значительно сокращает вышеуказанный код (в идеале его можно укоротить в 3 раза). Покажите класс, напишите такой макрос прямо здесь, думаю как минимум на джуниора вас возьмут точно. Я бы взял, так как джуниор такого точно не напишет. ДТ>Тогда почему Вы обиделись, когда я недвусмысленно намекнул, что с++ — это, вообще говоря гавноязык (хоть С++ программисты и являются самой многочисленной среди всех программистов группой)?
Во первых, я ни на что не обижался, меня обидеть весьма непросто даже специально. А во вторых, я знаю только один говноязык. Это бейсик, который был в 80-х годах. Без процедур, с односимвольными переменными и тому подобным. Как на нем написать что то серьезное — не представляю, лично мне в то время на ассемблере было на порядок проще писать. Любой другой язык, включая Visual Basic, PHP — с моей точки зрения говноязыком не является.
Здравствуйте, Доктор ТуамОсес, Вы писали:
ДТ>Тогда почему Вы обиделись, когда я недвусмысленно намекнул, что с++ — это, вообще говоря гавноязык (хоть С++ программисты и являются самой многочисленной среди всех программистов группой)?
Чтоб оскорблять язык надо хотя бы поработать на нем достаточно долгое время на серьезных проектах.
Здравствуйте, Доктор ТуамОсес, Вы писали:
ДТ>Почитал я Вас ребята и от души поржал. ДТ>Вы называете "гавнокодом" вполне приличный код. ДТ>Говорите что это "ужас", "кошмар"? ДТ>А как Вам ЭТО?
ДТ>Это очень читабельно? ДТ>Это не "ужас"?
ДТ>Тем не менее это реальный код из микрософтовского инклуда c:\Program Files\Microsoft Visual Studio\VC98\Include\COMDEF.H студии MSVC++ 6.0 ДТ>
Дохтур, открой свою книжку с вопросами по С++ и повтори следующие моменты:
ДТ>Это очень читабельно? ДТ>Это не "ужас"? ДТ>Тем не менее это реальный код из микрософтовского инклуда c:\Program Files\Microsoft Visual Studio\VC98\Include\COMDEF.H студии MSVC++ 6.0
Это автосгенеренный заголовочный файл — он не предназначен для чтения.
_FR>Учитывая же ошибки в коде (отсутствие проверок в стриме и то, что стрим может закрыться после того, как бдует передан в этот код) ценность его чуть больше нуля.
Почти со всем согласен. Но вот по этой части вопрос — ну, может быть эксепшен, и что?
using корректно всё освободит.
А если сам стрим будет закрыт где-то еще... Ну, bad luck.
Как ты предполагаешь от этого застраховаться? Копию сделать для начала? А если стрим закроют в процессе создания копии?
ИМХО, надуманная претензия..
DD>Увольнять любого, кто пишет код и комментарии не на английском.
тут есть исключение: когда код связан с обработкой (неанглоязычных) текстов, и комментарии поясняют какой именно кейс обрабатывается. Что-то типа такого.
Здравствуйте, Nik_1, Вы писали:
N_>Здравствуйте, catBasilio, Вы писали:
B>>Здравствуйте, DorfDepp, Вы писали:
DD>>>Здравствуйте, YetAnotherOne, Вы писали:
DD>>>Увольнять любого, кто пишет код и комментарии не на английском.
B>>А что не так с комметариями? По опыту могу сказать что так как девелоперы — народ русскоязычный то в цепочке
N_>Кстати, это тема! Надо всем договориться писать коментарии тока на русском языке, тогда другим поддерживать наш код будет труднее и спрос на русских разрабов вырастет.
Ви нид ту гоу дипер. Тогда уж нужно и переменные, и имена ф-ций и т.д. на русском называть. Либо Прямоугольник::Размер(), либо Prjamougoljnik::Razmer(). 1-ый вариант студия, с++ переваривает.
Здравствуйте, DorfDepp, Вы писали:
DD>Увольнять любого, кто пишет код и комментарии не на английском.
В России/Украине/Молдове можно сделать проект дешевле всего. Самая дешевая раб. сила (индусов в топку -- с ними отдельный разговор). Так что если проект не планируется никуда аутсорсить -- вполне нормальный вариант комментировать на русском.
Здравствуйте, Nik_1, Вы писали:
N_>Кстати, это тема! Надо всем договориться писать коментарии тока на русском языке, тогда другим поддерживать наш код будет труднее и спрос на русских разрабов вырастет.
На них и так спрос большой. Только мало нормальных.
Здравствуйте, 0K, Вы писали:
0K>Здравствуйте, Nik_1, Вы писали:
N_>>Кстати, это тема! Надо всем договориться писать коментарии тока на русском языке, тогда другим поддерживать наш код будет труднее и спрос на русских разрабов вырастет.
0K>На них и так спрос большой.
Вот и надо поддерживать его чтоб так было всегда 0K>Только мало нормальных.
вы просто неумеете их искать.
Здравствуйте, 0K, Вы писали:
0K>Самая дешевая раб. сила (индусов в топку -- с ними отдельный разговор).
Нууу... почему так? Интересные жизнерадостные люди. Пишут код, поют, танцуют. По крайней мере не ходят с угрюмыми лицами, словно кто-то помер, как некоторые.
Здравствуйте, YetAnotherOne, Вы писали:
YAO>Как вы считаете, является ли данный класс говнокодом? Если бы вам предложили поддерживать проект с подобным кодом, вы бы были в восторге или огорчились бы? По сравнению с качеством кода в вашей конторе хуже или лучше? Во сколько бы оценили по 5-ти бальной шкале?
Здравствуйте, _FRED_, Вы писали:
_FR>Что видно здесь: какие-то (private) методы названы в камеле, какие-то (internal) в паскале. Это в топку.
Это начальство из явы
_FR>Свойство, возвращающее string и при этом которое [CanBeNull] туда-же. Строковое свойство не должно возвращать null. Вместо него надо возвращать String.Empty, что бы избавить вызывающего от не нужных проверок (а когда проверка нужна, то проверка на null и на String.IsNullOrEmpty() — не велика разница). К тому же, если свойства реализованы явно (а не автосвойствами) принято снабжать get-accessor атрибутом [DebuggerStepThrough]. Без этого не редко отладка превращается в чёрте-что.
Вот то что в черте знает что — согласен.
_FR>Дальше — разбить большие методы на несколько поменьше было бы полезно: невооружённым взглядом видно, что, например, вынесение вычисления энкодинга никому не помешает.
Нельзя.
_FR>Литералы так же полезно объявить заранее в виде констант, хотя бы в самом методе. Захардкоженный текст сообщений об ошибках я ещё почему-то могу понять, если он на _английском_, но на русском такое категорически не переваривается.
Ну нельзя же
_FR>Вообще, если окинуть взглядом весь класс, видно, что вся его работа заключается в том, что бы из пары (StreamReader) получить тройку (HttpHeaders, string, Encoding). При этом зачем-то используются пара статических методов и один экземплярный, который меняет поля объекта, которому принадлежит. Я бы так и написал несколько бы статических методов, которые вычисляют
Ну не так уж и явно
_FR> _FR>HttpHeaders в зависимости от того, какая фабрика вызвана: ParseRequest или ParseResponse _FR>Encoding по вычесленному выше HttpHeaders _FR>string и энкодинг по стриму, хидерам и энкодингу из хидеров. _FR>
_FR>Получилось бы три независимых метода. Вызвал их по очереди (не в конструкторе), получил три переменных, после этого создавай неизменяемый объект из трёх полей и возвращай его.
Да там ошибок то нет (логических)
_FR>Учитывая же ошибки в коде (отсутствие проверок в стриме и то, что стрим может закрыться после того, как бдует передан в этот код) ценность его чуть больше нуля.
Здравствуйте, Nik_1, Вы писали:
N_>Здравствуйте, catBasilio, Вы писали:
B>>Здравствуйте, DorfDepp, Вы писали:
DD>>>Здравствуйте, YetAnotherOne, Вы писали:
DD>>>Увольнять любого, кто пишет код и комментарии не на английском.
B>>А что не так с комметариями? По опыту могу сказать что так как девелоперы — народ русскоязычный то в цепочке
N_>Кстати, это тема! Надо всем договориться писать коментарии тока на русском языке, тогда другим поддерживать наш код будет труднее и спрос на русских разрабов вырастет.
Смех смехом, а автоматические комментарии в русской студии — на русском.