Re: Говнокод ли это?
От: Lloyd Россия  
Дата: 19.08.11 14:32
Оценка: 1 (1) +11
Здравствуйте, YetAnotherOne, Вы писали:

YAO>Как вы считаете, является ли данный класс говнокодом? Если бы вам предложили поддерживать проект с подобным кодом, вы бы были в восторге или огорчились бы? По сравнению с качеством кода в вашей конторе хуже или лучше? Во сколько бы оценили по 5-ти бальной шкале?


Это просто конфетка по сравнению с тем, с чем приходится работать. Поставил бы твердую 4+.
Re[2]: Говнокод ли это?
От: Vzhyk  
Дата: 19.08.11 16:03
Оценка: 1 (1) +4
19.08.2011 18:55, elmal пишет:

> Тут интересный вопрос. Свой худший код, который писался часто в ASAP

> режиме я оцениваю на 3 или 3- (копипасту я даже в ASAP режиме не
> допускаю, бывает спускаюсь и ниже удовлетворительного, но в таком
> состоянии код живет не больше недели, потом меня совесть замучит).
> Максимальную оценку себе я выше 4 еще не ставил.
Ты бы свой код сюда выложил. Мы бы посмотрели, обос... обсудили.
Posted via RSDN NNTP Server 2.1 beta
Re[3]: Говнокод ли это?
От: Lloyd Россия  
Дата: 19.08.11 19:28
Оценка: 1 (1) +3
Здравствуйте, YetAnotherOne, Вы писали:

L>>Это просто конфетка по сравнению с тем, с чем приходится работать. Поставил бы твердую 4+.


YAO>Вы не шутите? То есть вы считаете, что это вполне нормально:


А я смысл не читал, только код посмотрел.
И таки-да, по сравнению с тем, с чем приходится работать, код-таки конфетка.
Re: Говнокод ли это?
От: Gradient http://www.x-trips.com/
Дата: 22.08.11 07:16
Оценка: 6 (2) +1
Здравствуйте, YetAnotherOne, Вы писали:

YAO>Как вы считаете, является ли данный класс говнокодом?


Мммм... няма! Руки чешутся отрефакторить.
А ведь с настоящим говонкодом вместо желания рефакторить возникает стойкое желание выкинуть и написать заново.
Так что пациент скорее жив чем мертв, поставлю 4
-----
Любимая фраза физика-теоретика: "Вот видите, мы ошиблись всего лишь на порядок".
Re: Говнокод ли это?
От: boot  
Дата: 19.08.11 15:44
Оценка: 4 (2) +1
Здравствуйте, YetAnotherOne, Вы писали:

YAO>Как вы считаете, является ли данный класс говнокодом? Если бы вам предложили поддерживать проект с подобным кодом, вы бы были в восторге или огорчились бы? По сравнению с качеством кода в вашей конторе хуже или лучше? Во сколько бы оценили по 5-ти бальной шкале?


Не понимаю, что заставляет людей так думать и писать. Может язык совместно с фрэймворком? Не понимаю, зачем объединять поток и структуру запроса/ответа в один класс. Может только чтобы потом написать application.run().
Оценку ставить не берусь, пока кто-нибудь не объяснит где это так надо.
Жизнеспособность прямо пропорциональна простоте!
Re[2]: Говнокод ли это?
От: YetAnotherOne  
Дата: 19.08.11 18:56
Оценка: 4 (1) +1
Здравствуйте, 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?

Я все таки надеюсь что вы не вдавались в подробности. Неужели и вы так пишите (вроде как у вас неплохая подборка званий)?

Или поставили 4+ как для Junior?
Re: Говнокод ли это?
От: _AND Российская Империя За Русский мир! За Русь святую!
Дата: 19.08.11 14:46
Оценка: +2
Здравствуйте, YetAnotherOne, Вы писали:

YAO>Как вы считаете, является ли данный класс говнокодом? Если бы вам предложили поддерживать проект с подобным кодом, вы бы были в восторге или огорчились бы? По сравнению с качеством кода в вашей конторе хуже или лучше? Во сколько бы оценили по 5-ти бальной шкале?


YAO>Код:


В логику сильно не вникал. На первый взгляд — обычный, нормальный код. Оценка 4+
Re: Говнокод ли это?
От: andrey.t  
Дата: 19.08.11 19:40
Оценка: 1 (1)
Здравствуйте, YetAnotherOne, Вы писали:

YAO>Как вы считаете, является ли данный класс говнокодом? Если бы вам предложили поддерживать проект с подобным кодом, вы бы были в восторге или огорчились бы? По сравнению с качеством кода в вашей конторе хуже или лучше? Во сколько бы оценили по 5-ти бальной шкале?


YAO>Код:


YAO>
YAO>


1. Если говорить про качество кода на уровне функции, то это очень хороший код — исключения и работа с ресурсами на месте, всё однообразно в соответствии с некоторыми правилами оформления кода. При желании можно быстро понять и разобраться. 4 из 5.

2. Если смотреть на класс сверху и начинать придиратся, то ни разу не Stream никакой. Да и закрытая readBody(), которая только в конструкторе дергается никак тестированию не поддается. Но на самом деле это — мелочи, которые наоборот только тянет улучшить, но никак не бежать в панике от этого кода, если таковой достанется.
Re: Говнокод ли это?
От: Tom Россия http://www.RSDN.ru
Дата: 19.08.11 20:22
Оценка: 1 (1)
Здравствуйте, YetAnotherOne, Вы писали:

YAO>Как вы считаете, является ли данный класс говнокодом? Если бы вам предложили поддерживать проект с подобным кодом, вы бы были в восторге или огорчились бы? По сравнению с качеством кода в вашей конторе хуже или лучше? Во сколько бы оценили по 5-ти бальной шкале?

Я бы сказал что структура кода конечно не лучшая, видно полное несоблюдение SOLID, функции имееют по 5-8 ответственностей. Но в целом код поддётся простому рефакторингу. По 5-ти бальной системе поставил бы твёрдую 3-ку.
Народная мудрось
всем все никому ничего(с).
Re[2]: Говнокод ли это?
От: catBasilio  
Дата: 10.09.11 10:05
Оценка: 1 (1)
Здравствуйте, DorfDepp, Вы писали:

DD>Здравствуйте, YetAnotherOne, Вы писали:


DD>Увольнять любого, кто пишет код и комментарии не на английском.


А что не так с комметариями? По опыту могу сказать что так как девелоперы — народ русскоязычный то в цепочке

коммент в голове (на русском) -> коммент в коде (на кривом англицком) ----> коммент в голове прочитавшего код девелопера (перевод на русский)


происходит искажение смысла по сравнению с цепочкой:


коммент в голове (рус) -> коммент в коде (рус) ----> коммент в другой голове (рус)

UNIX way — это когда тебе вместо туалетной бумаги дают топор, рубанок и карту близлежащего леса
Re[2]: Говнокод ли это?
От: mucks  
Дата: 20.08.11 14:20
Оценка: :)
Здравствуйте, sc, Вы писали:

sc>Вдруг подумалось, а антоним у слова говногод есть? Например златокод


Конфеткод
Re: Говнокод ли это?
От: тс  
Дата: 20.08.11 16:55
Оценка: :)
Здравствуйте, YetAnotherOne, Вы писали:

Это не говнокод, это говноязык
Re: Говнокод ли это?
От: DorfDepp  
Дата: 09.09.11 22:01
Оценка: -1
Здравствуйте, YetAnotherOne, Вы писали:

Увольнять любого, кто пишет код и комментарии не на английском.
Re[3]: Говнокод ли это?
От: Nik_1 Россия  
Дата: 10.09.11 10:27
Оценка: :)
Здравствуйте, catBasilio, Вы писали:

B>Здравствуйте, DorfDepp, Вы писали:


DD>>Здравствуйте, YetAnotherOne, Вы писали:


DD>>Увольнять любого, кто пишет код и комментарии не на английском.


B>А что не так с комметариями? По опыту могу сказать что так как девелоперы — народ русскоязычный то в цепочке


Кстати, это тема! Надо всем договориться писать коментарии тока на русском языке, тогда другим поддерживать наш код будет труднее и спрос на русских разрабов вырастет.
Говнокод ли это?
От: YetAnotherOne  
Дата: 19.08.11 14:23
Оценка:
Как вы считаете, является ли данный класс говнокодом? Если бы вам предложили поддерживать проект с подобным кодом, вы бы были в восторге или огорчились бы? По сравнению с качеством кода в вашей конторе хуже или лучше? Во сколько бы оценили по 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-Type
                                var 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);
        }
    }
Re: Говнокод ли это?
От: UA Украина  
Дата: 19.08.11 14:50
Оценка:
Здравствуйте, YetAnotherOne, Вы писали:

Без goto тянет только на 3-
Re: Говнокод ли это?
От: Доктор ТуамОсес Гондурас Мой новый проект "ВЕПРЬ-1"
Дата: 19.08.11 15:34
Оценка:
Здравствуйте, YetAnotherOne, Вы писали:

YAO>Говнокод ли это?

Такие вопросы лучше завать ТУТ
Мой новый проект "ВЕПРЬ-1"
Re: Говнокод ли это?
От: elmal  
Дата: 19.08.11 15:55
Оценка:
Здравствуйте, YetAnotherOne, Вы писали:

YAO>Как вы считаете, является ли данный класс говнокодом? Если бы вам предложили поддерживать проект с подобным кодом, вы бы были в восторге или огорчились бы? По сравнению с качеством кода в вашей конторе хуже или лучше? Во сколько бы оценили по 5-ти бальной шкале?

Тут интересный вопрос. Свой худший код, который писался часто в ASAP режиме я оцениваю на 3 или 3- (копипасту я даже в ASAP режиме не допускаю, бывает спускаюсь и ниже удовлетворительного, но в таком состоянии код живет не больше недели, потом меня совесть замучит). Максимальную оценку себе я выше 4 еще не ставил. А на код, которому можно 5 поставить, я бы просто хотел бы посмотреть — всегда есть простор к улучшению .
Уроверь писавшего оцениваю как юниорский. Код бы я оценил на 2, то есть неудовлетворительно, но не смертельно. Тт человека, с опытом меньше двух лет, как показывает практика, лучшего кода ожидать бессмысленно. Это не такая плохая оценка, худший код, который я видел, я б оценил в 0 из 5 (писали американские студенты). А этот можно довольно быстро привести к удовлетворительному состоянию, если поизбавляться от некоторой копипасты, сократить и повысить понятность можно легко, более глубоко даже лень смотреть пока не отрефакторю.
Предполагаю, что это код тестового задания. Соответственно студента, сильному в теории и написавшего подобный код я бы взял на юниора, переучить можно. Если б такое написал кто-то, претендующий на хорошего разработчика — извините, есть куча других контор, которых этот код удовлетворит в полной мере (да там и кодировать не попросят, максимум на бумажке, где по нормальному один хрен не напишешь), у нас он просто не впишется в коллектив.
Если бы мне предложили поддерживать проект с подобным кодом за 200 тысяч в месяц я б обрадовался. За 120 тысяч я б подумал. За 100 тысяч — твердо б не согласился. Но в конторах с таким кодом мне и 50 не предложат .
Re: Говнокод ли это?
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 19.08.11 16:00
Оценка:
Здравствуйте, YetAnotherOne, Вы писали:

YAO>Как вы считаете, является ли данный класс говнокодом? Если бы вам предложили поддерживать проект с подобным кодом, вы бы были в восторге или огорчились бы? По сравнению с качеством кода в вашей конторе хуже или лучше? Во сколько бы оценили по 5-ти бальной шкале?


Троечка. В принципе это код хорошего джуниора
Re[2]: А слабо этот говнокод превратить в конфетку?
От: gyraboo  
Дата: 19.08.11 16:10
Оценка:
Здравствуйте, Доктор ТуамОсес, Вы писали:

YAO>>Говнокод ли это?

ДТ>Такие вопросы лучше завать ТУТ

Дохтур, прошу показать мастер-класс на данном примере и реально утреть наконец-таки нос вашим недоброжелателям и тролле-изличителям.

1. Анализ данного примера, выявление проблем
2. Обоснованный рефакторинг
Re[2]: Говнокод ли это?
От: Доктор ТуамОсес Гондурас Мой новый проект "ВЕПРЬ-1"
Дата: 19.08.11 16:14
Оценка:
Если у Вас много гавнокода, то обращайтесь ко мне. Помогу.
РАБОТАЮ С ГАВНОКОДОМ! ДЁШЕВО
Автор: Доктор ТуамОсес
Дата: 03.08.11
Мой новый проект "ВЕПРЬ-1"
Re[2]: Говнокод ли это?
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 19.08.11 16:15
Оценка:
Здравствуйте, boot, Вы писали:

B>Не понимаю, что заставляет людей так думать и писать. Может язык совместно с фрэймворком? Не понимаю, зачем объединять поток и структуру запроса/ответа в один класс. Может только чтобы потом написать application.run().


Потому что для джуниоров
1 это предельно наглядно, т.к. все еще слабо решают задачи, что бы делать это в уме, соответсвенно код своего рода черновик
2 еще не научились декомпозиции, например выделять определенные обязанности
3 не понимают все имеющиеся проблемы в таком коде
4 не правильно оценивают важность известных им проблем
Re: Говнокод ли это?
От: tovarish_n  
Дата: 19.08.11 19:43
Оценка:
Здравствуйте, YetAnotherOne, Вы писали:

Жить можно. 4.
Re: Говнокод ли это?
От: abibok  
Дата: 19.08.11 23:05
Оценка:
YAO>Как вы считаете, является ли данный класс говнокодом? Если бы вам предложили поддерживать проект с подобным кодом, вы бы были в восторге или огорчились бы? По сравнению с качеством кода в вашей конторе хуже или лучше? Во сколько бы оценили по 5-ти бальной шкале?

Код не очень хорош, есть замечания и по стилю, и по структуре, и по реализации. Но приходилось работать и с намного более плохим кодом, так что все не очень страшно. 4-
Re: readed?
От: qqqqq  
Дата: 19.08.11 23:45
Оценка:
мне бросились в глаза переменные под названием readed. Это "считано" в пререводе на рунглиш?
Re[3]: Говнокод ли это?
От: elmal  
Дата: 20.08.11 03:34
Оценка:
Здравствуйте, Vzhyk, Вы писали:

V>Ты бы свой код сюда выложил. Мы бы посмотрели, обос... обсудили.

Код проекта, увы, выкладывать нет желания на всеобщее обозрение. А код проваленного простого тестового задания, на который даже фидбека никакого не получил, как то даже выкладывал здесь
Автор: elmal
Дата: 20.12.09
.
Здесь ИМХО ближе к 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 по человечески.
Re[2]: Говнокод ли это?
От: Nik_1 Россия  
Дата: 20.08.11 04:22
Оценка:
Здравствуйте, Доктор ТуамОсес, Вы писали:

ДТ>Здравствуйте, YetAnotherOne, Вы писали:


YAO>>Говнокод ли это?

ДТ>Такие вопросы лучше завать rl=http://govnokod.ru/cpp]ТУТ[u
а причем тут с++?
Re: Говнокод ли это?
От: _FRED_ Черногория
Дата: 20.08.11 07:47
Оценка:
Здравствуйте, YetAnotherOne, Вы писали:

YAO>Как вы считаете, является ли данный класс говнокодом? Если бы вам предложили поддерживать проект с подобным кодом, вы бы были в восторге или огорчились бы? По сравнению с качеством кода в вашей конторе хуже или лучше? Во сколько бы оценили по 5-ти бальной шкале?


YAO>Код:


С точки зрения оформления/написания (а не банально работоспособности) я оцениваю код по тому, на сколько он последователен, не противоречив.

Что видно здесь: какие-то (private) методы названы в камеле, какие-то (internal) в паскале. Это в топку. Свойство, возвращающее string и при этом которое [CanBeNull] туда-же. Строковое свойство не должно возвращать null. Вместо него надо возвращать String.Empty, что бы избавить вызывающего от не нужных проверок (а когда проверка нужна, то проверка на null и на String.IsNullOrEmpty() — не велика разница). К тому же, если свойства реализованы явно (а не автосвойствами) принято снабжать get-accessor атрибутом [DebuggerStepThrough]. Без этого не редко отладка превращается в чёрте-что.

Дальше — разбить большие методы на несколько поменьше было бы полезно: невооружённым взглядом видно, что, например, вынесение вычисления энкодинга никому не помешает. Литералы так же полезно объявить заранее в виде констант, хотя бы в самом методе. Захардкоженный текст сообщений об ошибках я ещё почему-то могу понять, если он на _английском_, но на русском такое категорически не переваривается.

Вообще, если окинуть взглядом весь класс, видно, что вся его работа заключается в том, что бы из пары (StreamReader) получить тройку (HttpHeaders, string, Encoding). При этом зачем-то используются пара статических методов и один экземплярный, который меняет поля объекта, которому принадлежит. Я бы так и написал несколько бы статических методов, которые вычисляют

  1. HttpHeaders в зависимости от того, какая фабрика вызвана: ParseRequest или ParseResponse
  2. Encoding по вычесленному выше HttpHeaders
  3. string и энкодинг по стриму, хидерам и энкодингу из хидеров.

Получилось бы три независимых метода. Вызвал их по очереди (не в конструкторе), получил три переменных, после этого создавай неизменяемый объект из трёх полей и возвращай его.

Учитывая же ошибки в коде (отсутствие проверок в стриме и то, что стрим может закрыться после того, как бдует передан в этот код) ценность его чуть больше нуля.
Help will always be given at Hogwarts to those who ask for it.
Re[3]: Говнокод ли это?
От: Доктор ТуамОсес Гондурас Мой новый проект "ВЕПРЬ-1"
Дата: 20.08.11 09:11
Оценка:
Здравствуйте, Nik_1, Вы писали:
N_>Здравствуйте, Доктор ТуамОсес, Вы писали:
ДТ>>Такие вопросы лучше завать rl=http://govnokod.ru/cpp]ТУТ[u
N_>а причем тут с++?
----------------------------
Не хотите С++ там есть гавнокод ещё на 18-ти языках
Мой новый проект "ВЕПРЬ-1"
Re: Говнокод ли это?
От: sc Россия  
Дата: 20.08.11 09:17
Оценка:
Вдруг подумалось, а антоним у слова говногод есть? Например златокод
Re: Говнокод ли это?
От: 24  
Дата: 20.08.11 10:02
Оценка:
Здравствуйте, YetAnotherOne, Вы писали:

YAO>Как вы считаете, является ли данный класс говнокодом? Если бы вам предложили поддерживать проект с подобным кодом, вы бы были в восторге или огорчились бы? По сравнению с качеством кода в вашей конторе хуже или лучше? Во сколько бы оценили по 5-ти бальной шкале?


Из минусов — сообщения об ошибках и комментарии на русском языке. По остальному — по-моему, нельзя давать оценки какому-то коду без учёта условий, в которых он писался, и целей, для которых он писался. В зависимости от них, один и тот же код может быть как хорошим, так и плохим.
Re[2]: Говнокод ли это?
От: Lloyd Россия  
Дата: 20.08.11 17:20
Оценка:
Здравствуйте, тс, Вы писали:

тс>Это не говнокод, это говноязык


да шо ви говорите! и что же в ваших краях признается за не-говно язык?
Re[2]: Говнокод ли это?
От: Lloyd Россия  
Дата: 20.08.11 17:23
Оценка:
Здравствуйте, sc, Вы писали:

sc>Вдруг подумалось, а антоним у слова говногод есть? Например златокод


А антоним не существует. Любой код хоть в каких-то случаях, но является говнокодом.
Re: Говнокод ли это?
От: 8bit  
Дата: 20.08.11 22:24
Оценка:
хардкоды...
нормально.
Re: Говнокод ли это?
От: BulatZiganshin  
Дата: 21.08.11 15:08
Оценка:
Здравствуйте, YetAnotherOne, Вы писали:

YAO>Как вы считаете, является ли данный класс говнокодом?


комментариев многовато — неинтересно разбираться
Люди, я люблю вас! Будьте бдительны!!!
Re[2]: Говнокод ли это?
От: Доктор ТуамОсес Гондурас Мой новый проект "ВЕПРЬ-1"
Дата: 21.08.11 15:41
Оценка:
Почитал я Вас ребята и от души поржал.
Вы называете "гавнокодом" вполне приличный код.
Говорите что это "ужас", "кошмар"?
А как Вам ЭТО?

Это очень читабельно?
Это не "ужас"?

Тем не менее это реальный код из микрософтовского инклуда c:\Program Files\Microsoft Visual Studio\VC98\Include\COMDEF.H студии MSVC++ 6.0
Мой новый проект "ВЕПРЬ-1"
Re[3]: Говнокод ли это?
От: тс  
Дата: 21.08.11 15:53
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>Здравствуйте, тс, Вы писали:


тс>>Это не говнокод, это говноязык


L>да шо ви говорите! и что же в ваших краях признается за не-говно язык?


Естессно c++11
Re[4]: Говнокод ли это?
От: Доктор ТуамОсес Гондурас Мой новый проект "ВЕПРЬ-1"
Дата: 21.08.11 16:42
Оценка:
Здравствуйте, тс, Вы писали:

тс>Здравствуйте, Lloyd, Вы писали:


L>>Здравствуйте, тс, Вы писали:


тс>>>Это не говнокод, это говноязык


L>>да шо ви говорите! и что же в ваших краях признается за не-говно язык?


тс>Естессно c++11


А Вы видели исходники либов, которые пишет мелкософт на этом НЕ-говноязыке?
Мой новый проект "ВЕПРЬ-1"
Re[3]: Говнокод ли это?
От: elmal  
Дата: 21.08.11 18:12
Оценка:
Здравствуйте, Доктор ТуамОсес, Вы писали:

ДТ>Тем не менее это реальный код из микрософтовского инклуда c:\Program Files\Microsoft Visual Studio\VC98\Include\COMDEF.H студии MSVC++ 6.0

Предлагаю показать мастер класс, и показать, как написать этот майкрософтовский код более коротко и понятно. Уверен, что если получится, от предложений о работе просто отбоя не будет.
Re[4]: Говнокод ли это?
От: Доктор ТуамОсес Гондурас Мой новый проект "ВЕПРЬ-1"
Дата: 21.08.11 18:25
Оценка:
Здравствуйте, elmal, Вы писали:

E>Здравствуйте, Доктор ТуамОсес, Вы писали:


ДТ>>Тем не менее это реальный код из микрософтовского инклуда c:\Program Files\Microsoft Visual Studio\VC98\Include\COMDEF.H студии MSVC++ 6.0

E>Предлагаю показать мастер класс, и показать, как написать этот майкрософтовский код более коротко и понятно. Уверен, что если получится, от предложений о работе просто отбоя не будет.
Своим сарказмом Вы, как я полагаю, хотите сказать что это невозможно?
Тогда почему Вы обиделись, когда я недвусмысленно намекнул, что с++ — это, вообще говоря гавноязык (хоть С++ программисты и являются самой многочисленной среди всех программистов группой)?
Мой новый проект "ВЕПРЬ-1"
Re[3]: Говнокод ли это?
От: Lloyd Россия  
Дата: 21.08.11 18:27
Оценка:
Здравствуйте, Доктор ТуамОсес, Вы писали:
ДТ>Говорите что это "ужас", "кошмар"?
ДТ>А как Вам ЭТО?

ДТ>Это очень читабельно?

ДТ>Это не "ужас"?

Вы либо ссылкой ошиблись, либо совершенно непонятно, что вы увидели в том коде нечитабельного.
Re[5]: Говнокод ли это?
От: Lloyd Россия  
Дата: 21.08.11 18:29
Оценка:
Здравствуйте, Доктор ТуамОсес, Вы писали:

L>>>да шо ви говорите! и что же в ваших краях признается за не-говно язык?


тс>>Естессно c++11


ДТ>А Вы видели исходники либов, которые пишет мелкософт на этом НЕ-говноязыке?


Кажется тс забыл упомянуть главное:
  Скрытый текст
Re[5]: Говнокод ли это?
От: тс  
Дата: 21.08.11 18:37
Оценка:
Здравствуйте, Доктор ТуамОсес, Вы писали:

ДТ>Здравствуйте, тс, Вы писали:


тс>>Здравствуйте, Lloyd, Вы писали:


L>>>Здравствуйте, тс, Вы писали:


тс>>>>Это не говнокод, это говноязык


L>>>да шо ви говорите! и что же в ваших краях признается за не-говно язык?


тс>>Естессно c++11


ДТ>А Вы видели исходники либов, которые пишет мелкософт на этом НЕ-говноязыке?


Что-то может видел.
Но зачем мелкософту c++, когда у него есть .Net
Re[5]: Говнокод ли это?
От: elmal  
Дата: 21.08.11 19:00
Оценка:
Здравствуйте, Доктор ТуамОсес, Вы писали:

ДТ>Своим сарказмом Вы, как я полагаю, хотите сказать что это невозможно?

Вот я и предлагаю показать, как это сделать. Навскидку я после 6 летнего перерыва не скажу, как написать равноценный макрос, который значительно сокращает вышеуказанный код (в идеале его можно укоротить в 3 раза). Покажите класс, напишите такой макрос прямо здесь, думаю как минимум на джуниора вас возьмут точно. Я бы взял, так как джуниор такого точно не напишет.
ДТ>Тогда почему Вы обиделись, когда я недвусмысленно намекнул, что с++ — это, вообще говоря гавноязык (хоть С++ программисты и являются самой многочисленной среди всех программистов группой)?
Во первых, я ни на что не обижался, меня обидеть весьма непросто даже специально. А во вторых, я знаю только один говноязык. Это бейсик, который был в 80-х годах. Без процедур, с односимвольными переменными и тому подобным. Как на нем написать что то серьезное — не представляю, лично мне в то время на ассемблере было на порядок проще писать. Любой другой язык, включая Visual Basic, PHP — с моей точки зрения говноязыком не является.
Re[5]: Говнокод ли это?
От: _Obelisk_ Россия http://www.ibm.com
Дата: 21.08.11 19:14
Оценка:
Здравствуйте, Доктор ТуамОсес, Вы писали:

ДТ>Тогда почему Вы обиделись, когда я недвусмысленно намекнул, что с++ — это, вообще говоря гавноязык (хоть С++ программисты и являются самой многочисленной среди всех программистов группой)?


Чтоб оскорблять язык надо хотя бы поработать на нем достаточно долгое время на серьезных проектах.



Душа обязана трудиться! (с) Н.Заболоцкий.
Re[3]: Говнокод ли это?
От: uncommon Ниоткуда  
Дата: 22.08.11 00:27
Оценка:
Здравствуйте, Доктор ТуамОсес, Вы писали:

ДТ>Почитал я Вас ребята и от души поржал.

ДТ>Вы называете "гавнокодом" вполне приличный код.
ДТ>Говорите что это "ужас", "кошмар"?
ДТ>А как Вам ЭТО?

ДТ>Это очень читабельно?

ДТ>Это не "ужас"?

ДТ>Тем не менее это реальный код из микрософтовского инклуда c:\Program Files\Microsoft Visual Studio\VC98\Include\COMDEF.H студии MSVC++ 6.0

ДТ>

Дохтур, открой свою книжку с вопросами по С++ и повтори следующие моменты:

* smart pointers
* typedef
* macros

и потом разбери, как

_COM_SMARTPTR_TYPEDEF(IFoo, __uuidof(IFoo));

превращается в:

typedef _com_ptr_t< _com_IIID<IFoo, __uuidof(IFoo)> > IFooPtr;

и что это значит.
Re: Говнокод ли это?
От: Паблик Морозов  
Дата: 22.08.11 07:39
Оценка:
Здравствуйте, YetAnotherOne, Вы писали:

YAO>Как вы считаете, является ли данный класс говнокодом?


Да.

YAO>Если бы вам предложили поддерживать проект с подобным кодом, вы бы были в восторге или огорчились бы?


Не испытал бы ни одну из данных эмоций.

YAO>По сравнению с качеством кода в вашей конторе хуже или лучше?


По разному. Бывает лучше, бывает хуже.

YAO>Во сколько бы оценили по 5-ти бальной шкале?


3 (если оно работает без ошибок).
Re[3]: Говнокод ли это?
От: Eye of Hell  
Дата: 22.08.11 07:52
Оценка:
ДТ>Это очень читабельно?
ДТ>Это не "ужас"?
ДТ>Тем не менее это реальный код из микрософтовского инклуда c:\Program Files\Microsoft Visual Studio\VC98\Include\COMDEF.H студии MSVC++ 6.0

Это автосгенеренный заголовочный файл — он не предназначен для чтения.
Re[2]: Говнокод ли это?
От: StandAlone  
Дата: 09.09.11 14:20
Оценка:
Здравствуйте, _FRED_, Вы писали:


_FR>Учитывая же ошибки в коде (отсутствие проверок в стриме и то, что стрим может закрыться после того, как бдует передан в этот код) ценность его чуть больше нуля.


Почти со всем согласен. Но вот по этой части вопрос — ну, может быть эксепшен, и что?
using корректно всё освободит.
А если сам стрим будет закрыт где-то еще... Ну, bad luck.
Как ты предполагаешь от этого застраховаться? Копию сделать для начала? А если стрим закроют в процессе создания копии?
ИМХО, надуманная претензия..
Re: твёрдая 4. Не говнокод точно!
От: Философ Ад http://vk.com/id10256428
Дата: 09.09.11 21:58
Оценка:
Немного смутил вот этот кусок.

YAO> do

YAO> {
YAO> // читаем до 2 подряд идущих CRLF
YAO> readed = stream.Read(buf, 0, 1);
YAO> if (readed != 1 || buf[0] != 13)
YAO> {
YAO> continue;
YAO> }
YAO> readed = stream.Read(buf, 0, 1);
YAO> if (readed != 1 || buf[0] != 10)
YAO> {
YAO> continue;
YAO> }
YAO> readed = stream.Read(buf, 0, 1);
YAO> if (readed != 1 || buf[0] != 13)
YAO> {
YAO> continue;
YAO> }
YAO> readed = stream.Read(buf, 0, 1);
YAO> if (readed == 1 && buf[0] == 10)
YAO> {
YAO> return;
YAO> }
YAO> } while (readed > 0);
YAO>[/c#]
Всё сказанное выше — личное мнение, если не указано обратное.
Re[2]: Говнокод ли это?
От: dilmah США  
Дата: 09.09.11 22:17
Оценка:
DD>Увольнять любого, кто пишет код и комментарии не на английском.

тут есть исключение: когда код связан с обработкой (неанглоязычных) текстов, и комментарии поясняют какой именно кейс обрабатывается. Что-то типа такого.
Re[4]: Говнокод ли это?
От: sc Россия  
Дата: 10.09.11 11:02
Оценка:
Здравствуйте, Nik_1, Вы писали:

N_>Здравствуйте, catBasilio, Вы писали:


B>>Здравствуйте, DorfDepp, Вы писали:


DD>>>Здравствуйте, YetAnotherOne, Вы писали:


DD>>>Увольнять любого, кто пишет код и комментарии не на английском.


B>>А что не так с комметариями? По опыту могу сказать что так как девелоперы — народ русскоязычный то в цепочке


N_>Кстати, это тема! Надо всем договориться писать коментарии тока на русском языке, тогда другим поддерживать наш код будет труднее и спрос на русских разрабов вырастет.


Ви нид ту гоу дипер. Тогда уж нужно и переменные, и имена ф-ций и т.д. на русском называть. Либо Прямоугольник::Размер(), либо Prjamougoljnik::Razmer(). 1-ый вариант студия, с++ переваривает.
Re[2]: Говнокод ли это?
От: 0K Ниоткуда  
Дата: 10.09.11 11:11
Оценка:
Здравствуйте, DorfDepp, Вы писали:

DD>Увольнять любого, кто пишет код и комментарии не на английском.


В России/Украине/Молдове можно сделать проект дешевле всего. Самая дешевая раб. сила (индусов в топку -- с ними отдельный разговор). Так что если проект не планируется никуда аутсорсить -- вполне нормальный вариант комментировать на русском.
=сначала спроси у GPT=
Re[4]: Говнокод ли это?
От: 0K Ниоткуда  
Дата: 10.09.11 11:12
Оценка:
Здравствуйте, Nik_1, Вы писали:

N_>Кстати, это тема! Надо всем договориться писать коментарии тока на русском языке, тогда другим поддерживать наш код будет труднее и спрос на русских разрабов вырастет.


На них и так спрос большой. Только мало нормальных.
=сначала спроси у GPT=
Re[5]: Говнокод ли это?
От: Nik_1 Россия  
Дата: 10.09.11 11:22
Оценка:
Здравствуйте, 0K, Вы писали:

0K>Здравствуйте, Nik_1, Вы писали:


N_>>Кстати, это тема! Надо всем договориться писать коментарии тока на русском языке, тогда другим поддерживать наш код будет труднее и спрос на русских разрабов вырастет.


0K>На них и так спрос большой.

Вот и надо поддерживать его чтоб так было всегда
0K>Только мало нормальных.
вы просто неумеете их искать.
Re[3]: Говнокод ли это?
От: DorfDepp  
Дата: 10.09.11 13:47
Оценка:
Здравствуйте, catBasilio, Вы писали:

B>

B>коммент в голове (на русском) -> коммент в коде (на кривом англицком) ----> коммент в голове прочитавшего код девелопера (перевод на русский)


Ну... у меня комментарии на английском в голову приходят. Мне русский читать тяжелее.
Re[3]: Говнокод ли это?
От: DorfDepp  
Дата: 10.09.11 13:49
Оценка:
Здравствуйте, 0K, Вы писали:

0K>Самая дешевая раб. сила (индусов в топку -- с ними отдельный разговор).


Нууу... почему так? Интересные жизнерадостные люди. Пишут код, поют, танцуют. По крайней мере не ходят с угрюмыми лицами, словно кто-то помер, как некоторые.
Re: Говнокод ли это?
От: _Raz_  
Дата: 10.09.11 21:38
Оценка:
Здравствуйте, YetAnotherOne, Вы писали:

YAO>Как вы считаете, является ли данный класс говнокодом? Если бы вам предложили поддерживать проект с подобным кодом, вы бы были в восторге или огорчились бы? По сравнению с качеством кода в вашей конторе хуже или лучше? Во сколько бы оценили по 5-ти бальной шкале?


Код мой. Отвечю на все, кроме языков коментария
... << RSDN@Home 1.2.0 alpha 5 (M6) rev. 1511>>
Re[2]: readed?
От: _Raz_  
Дата: 10.09.11 21:43
Оценка:
Здравствуйте, qqqqq, Вы писали:

Q>мне бросились в глаза переменные под названием readed. Это "считано" в пререводе на рунглиш?

оно самое
... << RSDN@Home 1.2.0 alpha 5 (M6) rev. 1511>>
Re[2]: Говнокод ли это?
От: _Raz_  
Дата: 10.09.11 21:56
Оценка:
Здравствуйте, _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>
  1. HttpHeaders в зависимости от того, какая фабрика вызвана: ParseRequest или ParseResponse
    _FR>
  2. Encoding по вычесленному выше HttpHeaders
    _FR>
  3. string и энкодинг по стриму, хидерам и энкодингу из хидеров.
    _FR>

_FR>Получилось бы три независимых метода. Вызвал их по очереди (не в конструкторе), получил три переменных, после этого создавай неизменяемый объект из трёх полей и возвращай его.

Да там ошибок то нет (логических)

_FR>Учитывая же ошибки в коде (отсутствие проверок в стриме и то, что стрим может закрыться после того, как бдует передан в этот код) ценность его чуть больше нуля.
... << RSDN@Home 1.2.0 alpha 5 (M6) rev. 1511>>
Re[4]: Говнокод ли это?
От: tofox2 Россия  
Дата: 10.09.11 22:01
Оценка:
Здравствуйте, Nik_1, Вы писали:

N_>Здравствуйте, catBasilio, Вы писали:


B>>Здравствуйте, DorfDepp, Вы писали:


DD>>>Здравствуйте, YetAnotherOne, Вы писали:


DD>>>Увольнять любого, кто пишет код и комментарии не на английском.


B>>А что не так с комметариями? По опыту могу сказать что так как девелоперы — народ русскоязычный то в цепочке


N_>Кстати, это тема! Надо всем договориться писать коментарии тока на русском языке, тогда другим поддерживать наш код будет труднее и спрос на русских разрабов вырастет.


Смех смехом, а автоматические комментарии в русской студии — на русском.
Re: Говнокод ли это?
От: _Raz_  
Дата: 10.09.11 22:08
Оценка:
Здравствуйте, YetAnotherOne, Вы писали:

Нет, так не интересно. Вы же понимаете что авторские права мои?
... << RSDN@Home 1.2.0 alpha 5 (M6) rev. 1511>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.