На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное DigiMania RSS
msm.ru
! В разделе обсуждаются следующие темы:
1) Процесс разработки программного обеспечения.
2) Определение требований к программному обеспечению.
3) Составные части и процесс проектирования (см. Шаблоны проектирования).
4) Документирование программного продукта(проекта).
5) Руководство разработкой программного обеспечения.
6) Проектирование пользовательского интерфейса.
7) Контроль версий проекта (см. Управление версиями в Subversion, Стратегии использования svn).
Модераторы: ElcnU
  
> Safety code, warning as error
    Не могу не написать, крик души.
    Маленький кусок из кода

    ExpandedWrap disabled
      /* 1.*/   int val = list.removeFirst();
      /* 2. */  System.out.println(" data = " + val);


    Случайно стер вторую строку , собрался запускать, вижу "The value of the local variable val is not used - compile error" т.k. в опциях стояло
    warning as error и оно меня по сути спасло, а без этой опции мог бы час ошибку искать.
    Когда то был холивар на эту тему, это его продолжение ;)

    P.S. На всякий случай, к C/C++ прямого отношения не имеет.
      JoeUser
      Верни обратно тему , это касается общих вопросов, это common programming issue,
      такие темы в C/C++, в крайнем случае holy wars.
        Цитата settler @
        Случайно стер вторую строку , собрался запускать, вижу "The value of the local variable val is not used - compile error" т.k. в опциях стояло
        warning as error и оно меня по сути спасло, а без этой опции мог бы час ошибку искать.

        Какую ошибку? Не используемую переменную ? :lol:
        А в чем ошибка заключается? В С++ такой же варнинг получил бы.
          Цитата settler @
          в опциях стояло
          warning as error и оно меня по сути спасло

          Я всегда включаю максимально возможный уровень предупреждений и обработку их как ошибок.
          Это действительно выручает и даже спасает.
          Особенно в таких случаях, когда, что-то случайно удалил, изменил, забыл и так далее.
          Человек должен делать то, что может сделать только он, всё остальное должна делать машина!
            Цитата KILLER @
            А в чем ошибка заключается? В С++ такой же варнинг получил бы.

            Ты опять ни хрена не понял , читай лучше ;)
            JoeUser Верни тему , это не ;) касается только Java,
            даже Киля это понял ;)
              Цитата settler @
              Ты опять ни хрена не понял , читай лучше ;)

              А что тут понимать? В твоем коде нет критических ошибок, на которые можно потратить час времени, есть не используемая переменная, от нее ни холодно, ни жарко, не знаю как java, а С++ компилятор при оптимизации ее скорее всего вообще выкинет из кода программы. Тут два варианта - либо ты только начал java изучать, нашел какой то варнинг, и решил блеснуть остатками мозгов. Либо ты реально по жизни такой.
              Твой пример не несет вообще никакой ценности, тут даже обсуждать нечего.
              Вот поясни мне, в чем заключается ошибка в этом коде?
              Вот тебе пример выполнения твоего кода:
              https://ideone.com/RomugS

              Ошибка в том, что ты не вывел значение переменной на экран или что? :scratch:

              Добавлено
              Я бы понял, если убрав вторую строчку, оптимизатор у тебя удалил бы первую строчку - тогда это была бы проблема. Но в твоем случае там идет вызов метода. Что оптимизатор выкинет вызов метода, из за того что твоя переменная ниже никак не используется?
                Цитата KILLER @
                Вот поясни мне, в чем заключается ошибка в этом коде?

                В вызове метода, который что-то возвращает и это что-то было поригнорировано. По-умолчанию, компилятор/IDE не обращают на это особого внимания. Можно включить предупреждение на такую ситуацию, можно (видимо) — ошибку компиляции. Зачем такое может быть нужно:

                1) хотя семантика языка допускает игнорирование возвращаемых значений, во многих случаях это может привести к логическим ошибкам, например, при использовании Hibernate, ты делаешь что-то в таком духе:
                ExpandedWrap disabled
                  SomeEntity entity = getEntityFromOutside() // e.g. from POST-request body
                  repository.save(entity);
                  return entity;

                Это не правильно, т.к. entity после вызова save — всё то же старое entity из тела запроса (возможно, без ID, например)
                Правильно так:
                ExpandedWrap disabled
                  SomeEntity entity = getEntityFromOutside() // e.g. from POST-request body
                  return repository.save(entity);

                repository.save возвращает обновлённый объект entity, каким он является после сохранения в БД. Если ты спросишь: почему repository.save просто не обновляет поля переданному ему entity? Отвечу: не знаю, возможно, Hibernate (или, точнее, Spring Repository) нужно как-то настраивать для этого, но, по-умолчанию, переданный entity не модифицируется, проверено. И вряд ли repository.save имеет такую сигнатуру (возвращающую объект того же типа), а не void, просто так, от нечего делать.

                И таких (которые что-то возвращают, но проверять возвращаемое значение не обязательно) методов много, в т.ч. в JDK. Видимо, из-за их большого количества и редкости реально необходимости проверки из резульата, по-умолчанию предупреждения отключены (или JDK'шные классы и методы добавлены в какой-то список исключений, хз).

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

                В Go, например, неиспользуемые идентификаторы приводят сразу к ошибке компиляции, ибо нефиг разводить мусор на ровном месте.

                Цитата KILLER @
                ты только начал java изучать

                Цитата KILLER @
                Вот тебе пример выполнения твоего кода

                Зачем ты создаёшь ещё один ArrayList? (хотя разница есть, но для примера не существенна)
                Зачем ты создаёшь объект Ideone, хотя можно было просто сделать метод getItem статическим?
                Зачем вообще вся эта махинация со списком, если можно было просто вернуть какое-то число?
                Имена методов в Java принято начинать со строчной буквы.
                “Object-oriented design is the roman numerals of computing.” — Rob Pike
                All software sucks
                  Цитата korvin @
                  В вызове метода, который что-то возвращает и это что-то было поригнорировано. По-умолчанию, компилятор/IDE не обращают на это особого внимания. Можно включить предупреждение на такую ситуацию, можно (видимо) — ошибку компиляции. Зачем такое может быть нужно:

                  И что на поиск этой ошибки обычно час времени уходит у тру папок?

                  Цитата korvin @
                  Это не правильно, т.к. entity после вызова save — всё то же старое entity из тела запроса (возможно, без ID, например)
                  Правильно так:

                  А причем тут твои примеры и его пример? Зачем ты мне приводишь эти примеры свои?
                  Вот ты реально решил рассказать мне искрене всю эту муть? Почитай сообщения этого товарища. Если бы он привел конкретный пример, когда у него случилась попаболь - и сказал, чуваки, вот тут мне компиль помог - я бы не возражал.
                  Но его конкретный пример не имеет академической или даже практической ценности. Так можно взять абсолютно любой варнинг на выбор, и написать то, что написал он. И чего? Почитай хоть перлы этого товарисча, прежде чем за него писать вот эти какие то банальные вещи.
                  А можно еще вызвать один и тот же метод два раза подряд, а потом думать - а че у меня другие вообще значения, а можно забыть написать new, а можно все что угодно сделать. И че? Давайте тут заведем тему на каждый варнинг компиля?

                  Цитата korvin @
                  Зачем ты создаёшь ещё один ArrayList? (хотя разница есть, но для примера не существенна)
                  Зачем ты создаёшь объект Ideone, хотя можно было просто сделать метод getItem статическим?
                  Зачем вообще вся эта махинация со списком, если можно было просто вернуть какое-то число?
                  Имена методов в Java принято начинать со строчной буквы.

                  Я на Java не пишу вообще, я показал просто всю тупость его примера. Ну забыл он вывести на экран переменную, и чего?

                  Добавлено
                  Цитата korvin @
                  Зачем ты создаёшь объект Ideone, хотя можно было просто сделать метод getItem статическим?

                  Затем, чтобы эмулировать целиковый объект, а не просто вызвать статическую функцию. У него в примере метод вызывается через объект, а не через класс. Соответственно скорее всего он не статический. С чего бы мне делать метод getItem статическим, объясни? Какой в этом смысл? Может быть тогда проще ООП выкинуть и все методы в Java писать статическими?

                  Цитата korvin @
                  Зачем вообще вся эта махинация со списком, если можно было просто вернуть какое-то число?

                  Что бы показать, что это не просто какой то метод, который возвращает какое то число, а он реально что то делает, создает внутри себя список и возвращает элемент по индексу. Этот пример написан на коленке ради демонстрации тупости его поста, уверяю тебя в продакшн он не попадет. Почему я не могу написать именно так, как я написал? Это запрещено? Я вот захотел написать именно вот так. А если бы я хотел написать по другому, то я бы написал по другому, просто вернул бы число. Но ведь очевидно же, что если я не просто вернул какое то число, значит я захотел написать именно так, как написал.
                  И вообще, почему ты у меня спрашиваешь - зачем я написал так, как написал, а у ТС не спрашиваешь зачем он написал так, как он написал?

                  Цитата korvin @
                  Имена методов в Java принято начинать со строчной буквы.

                  Кем принято? Ворнинг вроде не летит, если писать с большой буквы, какие проблемы?

                  Добавлено
                  Цитата korvin @
                  Зачем ты создаёшь ещё один ArrayList? (хотя разница есть, но для примера не существенна)

                  Так в вашей Java список иницилизации передать в конструктор нельзя, пришлось писать Arrays.asLis, а так как я сначала хотел инициализировать через конструктор списком иницилизации, то получилась вот такая копипаста, потому что Arrays.asLis я скопипастил с другого места. Хотя new ArrayList<Integer> и можно было и убрать, но мне было лень это делать.

                  Добавлено
                  Еще можно забыть инициализировать переменную к слову, или инициализировать не тем значением, а потом ниже ее использовать и час ловить ошибку. Создавай тему на этот варнинг. Про неиспользуемую переменную тема уже есть. Обязательно теперь нужно создать тему про неинициализированную или неправильно инициализированную переменную.

                  Добавлено
                  Да, и если че - тема эта была создана в разделе С++ - зачем она была там создана и какая цель этой темы, korvin объясни мне? А то товарисч слился, а я смотрю ты в теме.
                  В С++ нет такого варнинга? Или он вопрос какой то задал? Или он что то путное написал? Ты можешь пояснить - зачем появилась эта тема, и какая у нее цель, и почему она вообще до сих пор находится в тематическом разделе, а не в клозете? О чем тут холиварить?

                  Добавлено
                  Цитата settler @
                  Маленький кусок из кода

                  Причем судя по его словам - этот код попадет в прод. В котором написано:
                  Цитата settler @
                  /* 1.*/ int val = list.removeFirst();
                  /* 2. */ System.out.println(" data = " + val);

                  Цитата settler @
                  Случайно стер вторую строку , собрался запускать, вижу "The value of the local variable val is not used - compile error" т.k. в опциях стояло
                  warning as error и оно меня по сути спасло, а без этой опции мог бы час ошибку искать.

                  Что ты не спросил у ТС почему выводится val, а называется в консоле data ? Какая же это data, когда это value, а не данные?
                  И что типа если бы warning as error у него не стояло, то в этом коде он бы час ошибку искал? :lol:
                  korvin, причем тут твои хибернейты, когда проблема еще глубже, как можно искать час ошибку, если ты выводишь переменную в консоль, а ее там нет? Придумай что нибудь получше своих примеров. Тут проблема то глубже :lool:

                  Добавлено
                  korvin, а почему ты такие глупые вопросы мне поназадавал, а у ТС забыл спросить - почему просто не написать:
                  ExpandedWrap disabled
                    System.out.println(" data = " + list.removeFirst());

                  ???

                  Добавлено
                  Зачем в его коде вообще взялась эта переменная, если она используется только в одном месте, судя по его крику души?

                  Добавлено
                  Цитата korvin @
                  2) (ближе к примеру ТС): независимо от того, выкинет компилятор неиспользуемую переменную или нет, она захламляет код, который потом ещё читать не только компилятору, и чем меньше в коде хлама, тем он понятней.

                  А в его примере она код не захламляет? Почему?
                  Сообщение отредактировано: KILLER -
                    Цитата KILLER @
                    И что на поиск этой ошибки обычно час времени уходит у тру папок?

                    Не знаю, что там у «тру папок», наверное, они такие ошибки не допускают.

                    Цитата KILLER @
                    А причем тут твои примеры и его пример? Зачем ты мне приводишь эти примеры свои?
                    Вот ты реально решил рассказать мне искрене всю эту муть? Почитай сообщения этого товарища. Если бы он привел конкретный пример, когда у него случилась попаболь - и сказал, чуваки, вот тут мне компиль помог - я бы не возражал.
                    Но его конкретный пример не имеет академической или даже практической ценности. Так можно взять абсолютно любой варнинг на выбор, и написать то, что написал он. И чего? Почитай хоть перлы этого товарисча, прежде чем за него писать вот эти какие то банальные вещи.

                    Затем, что ты ведёшь себя как школьник. Впрочем, как обычно.

                    Цитата KILLER @
                    Затем, чтобы эмулировать целиковый объект, а не просто вызвать статическую функцию.

                    Зачем тебе «эмулировать целиковый объект»?

                    Цитата KILLER @
                    У него в примере метод вызывается через объект, а не через класс. Соответственно скорее всего он не статический.

                    Это не играет никакой роли.

                    Цитата KILLER @
                    С чего бы мне делать метод getItem статическим, объясни? Какой в этом смысл?

                    С того, что он никак не связан с объектом логически и архитектурно.

                    Цитата KILLER @
                    Может быть тогда проще ООП выкинуть и все методы в Java писать статическими?

                    Юношеский максимализм?

                    Цитата KILLER @
                    Кем принято?

                    Java-программистами, разработчиком языка, «корпорацие Добра», всеми, в общем.

                    Цитата KILLER @
                    какие проблемы?

                    Такие же, как если бы кто-то писал плюсовый код ВоТ_ТаКиМ_ПрИкОлЬнЫм_СтИлЕм();

                    Цитата KILLER @
                    Так в вашей Java список иницилизации передать в конструктор нельзя, пришлось писать Arrays.asLis, а так как я сначала хотел инициализировать через конструктор списком иницилизации, то получилась вот такая копипаста, потому что Arrays.asLis я скопипастил с другого места. Хотя new ArrayList<Integer> и можно было и убрать, но мне было лень это делать.

                    Ага, т.е. «либо ты только начал java изучать, нашел какой то варнинг, и решил блеснуть остатками мозгов. Либо ты реально по жизни такой.»?

                    Я к тому, что претензии и примеры кода от тебя как человека, не знакомого с Java выглядят точно так же как изначальный пост ТС'а.

                    Цитата KILLER @
                    Да, и если че - тема эта была создана в разделе С++ - зачем она была там создана и какая цель этой темы, korvin объясни мне?

                    Это не ко мне вопрос.

                    Цитата KILLER @
                    а я смотрю ты в теме.

                    В теме чего? Его мотивации / мыслительного процесса? Нет, не в теме.

                    Цитата KILLER @
                    причем тут твои хибернейты, когда проблема еще глубже, как можно искать час ошибку, если ты выводишь переменную в консоль, а ее там нет? Придумай что нибудь получше своих примеров. Тут проблема то глубже

                    Тут нет никакой «глубокой проблемы», зачем ты её выдумал — не понятно.

                    Цитата KILLER @
                    Зачем в его коде вообще взялась эта переменная, если она используется только в одном месте, судя по его крику души?

                    Почему ты задаёшь все эти вопросы мне, а не ТС?

                    Цитата KILLER @
                    а почему ты такие глупые вопросы мне поназадавал

                    Потому что ты ты понаписал херни не по существу с, якобы, «умным видом», при этом фактически оказался ничем не умнее ТСа.

                    Цитата KILLER @
                    а у ТС забыл спросить - почему просто не написать

                    Потому что, во-первых, пост не об этом, а во-вторых, смотри ниже:

                    Цитата KILLER @
                    А в его примере она код не захламляет? Почему?

                    Потому что она используется. С одной стороны, можно было бы написать в обну строку, как ты предложил, без промежуточной переменной, но, в, общем случае, лучше не использовать вызовы нечистых методов внутри чистых выражений (expressions).

                    Например тут есть краткое объяснение и пара полезных ссылок:
                    https://en.wikipedia.org/wiki/Command–query_separation
                    https://en.wikipedia.org/wiki/Uniform_access_principle

                    В целом, конечно, это не что-то суперкритичное, и тебе, как плюсовику, наверняка известенн этот небольшой сишный «паттерн» (впрочем, не знаю, как ты к нему относишься):

                    ExpandedWrap disabled
                      int nRead;
                      while ((nRead = in.read()) != -1) { // побочный эффект внутри expression
                          ...
                      }

                    Но в общем случае, так лучше не делать и на такой код IDE может выдать предупреждение (по-умолчанию, в IDEA и NetBeans ворнинг на подобный код, вроде, отключён, я его сам включаю в числе многих других).
                    “Object-oriented design is the roman numerals of computing.” — Rob Pike
                    All software sucks
                      Цитата korvin @
                      Не знаю, что там у «тру папок», наверное, они такие ошибки не допускают.

                      Ну вон в первом посте тру папка чуть час ошибку не искал, хорошо копилятор помог ему.

                      Цитата korvin @
                      Затем, что ты ведёшь себя как школьник. Впрочем, как обычно.

                      Какой школьник, ты о чем? Я просто высказал свою позицию, чтоб жирный тролль перестал забивать тематику своими тупыми постами, он во флейме всех уже достал, теперь решил в тематику видимо перебраться. А к чему твой первый пост, если по твоему я веду себя как школьник? Он что то проясняет или как?
                      Или может быть ты глаза кому то открыл, написав тот пост, что выше?

                      Цитата korvin @
                      Зачем тебе «эмулировать целиковый объект»?

                      Захотелось мне так. Или ты не читатель? А зачем я должен был писать там статическую функцию, которая возвращает число?

                      Цитата korvin @
                      Это не играет никакой роли.

                      Играет. В одном случае метод живет отдельно от класса, и может быть вызван без его создания, в другом случае метод не может быть вызван без создания экземпляра класса. Разве это не очевидно?

                      Цитата korvin @
                      С того, что он никак не связан с объектом логически и архитектурно.

                      Он выполняет свое предназначение, этого достаточно. У меня не было цели связывать что то логически и архитектурно, у меня была цель показать всю тупость первого поста. Я ее достиг.

                      Цитата korvin @
                      Юношеский максимализм?

                      Зачем ты ведешь себя как школьник? Как этот ответ вообще относится к тому, что ты процитировал? Тебе может быть возразить просто нечего?

                      Цитата korvin @
                      Java-программистами, разработчиком языка, «корпорацие Добра», всеми, в общем.

                      Ну так и флаг им в руки, этим Java-программистам, я не Java-программист. Можно я буду писать методы с большой буквы? Или ты мне не разрешаешь? :lol:

                      Цитата korvin @
                      Такие же, как если бы кто-то писал плюсовый код ВоТ_ТаКиМ_ПрИкОлЬнЫм_СтИлЕм();

                      Юниксоиды и всякие гнушники обычно и пишут таким прикольным стилем. Их право. Какое мне дело до них. А по существу есть что сказать?

                      Цитата korvin @
                      Ага, т.е. «либо ты только начал java изучать, нашел какой то варнинг, и решил блеснуть остатками мозгов. Либо ты реально по жизни такой.»?

                      Во первых я Java не начинал даже изучать, я на ней не пишу, тебе сколько раз повторять? Во вторых, ты в каждой дырке - затычка? Или за брата своего меньшего решил вписаться? :lol: Что это у тебя ни с того, ни с сего попаболь возникла от того, что я пресек тупой троллинг, тупого тролля? Он тебе каким то родственником является наверное? Уж не по интеллекту ли? :whistle:

                      Цитата korvin @
                      Я к тому, что претензии и примеры кода от тебя как человека, не знакомого с Java выглядят точно так же как изначальный пост ТС'а.

                      А я считаю что я привел хороший пример. Вся твоя критика свелась к тому что я не с той буквы метод обозвал, да не возвратил число в статическом методе, как тебе хотелось наверное. Значит больше придраться ты не нашел к чему. Соотвественно пример просто великолепен.

                      Цитата korvin @
                      Это не ко мне вопрос.

                      А к кому? Брат твой меньший слинял, ты за него решил дырку заткнуть, ну раз ты в теме, так и ответь мне на вопрос - какую цель преследует эта тема? Ты же там начал что то объяснять, видимо в теме.

                      Цитата korvin @
                      В теме чего? Его мотивации / мыслительного процесса? Нет, не в теме.

                      В теме того, что он хотел сказать создав эту тупую тему. Хватит отнекиваться, ты же начал за него писать, так будь добр отвечай до конца :whistle:

                      Цитата korvin @
                      Тут нет никакой «глубокой проблемы», зачем ты её выдумал — не понятно.

                      Я ничего не выдумывал, это у ТС проблема на столько глубока, что ошибку связанную с неиспользуемой переменной он ищет около часа. И ты судя по всему ровно такого же мнения, раз начал писать какую то хрень про хибернейты. Иначе зачем ты все это писал?

                      Цитата korvin @
                      Почему ты задаёшь все эти вопросы мне, а не ТС?

                      Это ведь очевидно, ТС слился, пришел ты и начал отвечать на мои вопросы адресованные ему, и критиковать мой супер код, соответственно я от тебя и требую пояснений. Ведь раз ты его пост не прокоментировал - а начал возражать мне, соответственно по твоему - его код вполне себе клевый. Вот я и спрашиваю тебя почему это он клевый с твоей точки зрения?

                      Цитата korvin @
                      Потому что ты ты понаписал херни не по существу с, якобы, «умным видом», при этом фактически оказался ничем не умнее ТСа.

                      Это с твоей точки зрения я написал херню. Потому что ты даже не понял какую цель преследовал этот пример. Притом что эту цель я прямым текстом описал в посте адресованном ТСу. Но пришел ты не разобравшись в деле написал херни с умным видом, при этом оказавшись ничем не умнее ТСа :lool:

                      Цитата korvin @
                      Потому что, во-первых, пост не об этом, а во-вторых, смотри ниже:

                      Ты трезвый вообще? Я у тебя спрашиваю - для чего ТС создал тему, какая у нее цель, к чему все это - ты мне отвечаешь, что ты не в теме. И тут же пишешь, что пост не об этом :lol: Так а о чем тогда пост? Ты не логичен и не последователен, и пишешь херню с юношеским максимализмом, преследуя цель хоть как то задеть оппонента. Но скажу честно - выходит у тебя не ахти. Выглядишь ты уныло.

                      Цитата korvin @
                      Потому что она используется.

                      Ну а почему бы вместо нее не поместить в то место вызов метода, как я написал выше? Какой в ней смысл, поясни?

                      Цитата korvin @
                      С одной стороны, можно было бы написать в обну строку, как ты предложил, без промежуточной переменной, но, в, общем случае, лучше не использовать вызовы нечистых методов внутри чистых выражений (expressions).

                      В каком общем случыае? И что такое нечистый метод? Чем он отличается от чистого метода? Что такое чистое выражение и чем оно отличается от нечистого выражения? Это какой то чисто сленг по понятиям?

                      Цитата korvin @
                      Например тут есть краткое объяснение

                      Какое объяснение? Объяснение чисто сленгу "нечистых функций" и "чистых выражений"? :lol: Т.е. какой то перец что то написал где то в коментарии на стековерфлоу и это стало мейнстримом? Или что?
                      Если эта переменная нигде больше не нужна, кроме как вывод куда то там, зачем ее нужно заводить? Почему ее нельзя напрямую вывести в метод?

                      Цитата korvin @

                      Интересно каким образом написанное по этим ссылкам имеет отношение к обсуждаемому? :scratch:

                      Цитата korvin @
                      while ((nRead = in.read()) != -1) { // побочный эффект внутри expression

                      А ты не путай волчий хрен и колбасу. В данном примере в цикле будет постоянно вызываться метод, что приведет к лишним накладным расходам. У ТС же в коде такой проблемы нет. Так как метод вызывается ровно 1 раз, и переменная используется ровно 1 раз.
                            Цитата KILLER @
                            В теме того, что он хотел сказать создав эту тупую тему.

                            В принципе да. Была создана тема в разделе "Общих вопросов по языку С/C++", с примером на Java, которая поднимала вопрос разработки вообще. Это нужно уметь.

                            Цитата settler @
                            warning as error и оно меня по сути спасло, а без этой опции мог бы час ошибку искать.

                            И простое бы предупреждение спасло - если бы была привычка писать чистый код и смотреть логи сборки.
                            Мои программные ништякиhttp://majestio.info
                              Скрытый текст
                              Цитата JoeUser @
                              Тема перенесена из Java

                              И нахрена ты удалил две последние портянки и перенес тему в МШ? Без последних двух порятянок тут уже нечего обсуждать. Сносил бы тогда ее в клозет. А этому дегенерату банку бы прописать не мешало бы. Или нонче за оскорбления банки не принято давать? Или вы как то избирательно модерируете форум? Сам же писал - в тематике оскорбления равняются банке.
                              Пора походу валить отсюда...
                              Сообщение отредактировано: JoeUser -
                                Скрытый текст
                                Цитата KILLER @
                                И нахрена ты удалил две последние портянки и перенес тему в МШ?

                                Я предупреждал - на редактирование срача у меня нет времени! Ни желания.
                                Мои программные ништякиhttp://majestio.info
                                  Скрытый текст
                                  Цитата JoeUser @
                                  Я предупреждал - на редактирование срача у меня нет времени! Ни желания.

                                  Во первых - этот срачь был не в политике, а в тематике. Во вторых, почитай что пишет это чудо. Он или еще из подросткового периода не вышел, или у него тяжелая депрессия, от чего он видимо набухался и пришел спустить пар на мне, со своим подростковым сленгом.

                                  Добавлено
                                  И какой смысл этой темы тут? Если две последние портянки ты уже удалил. По новой что ли их писать? Нет уж увольте.
                                  !
                                  Киля, я не буду заниматься доказательством правильности своего модерирования! И тебе советую не нарушать Правила п.1.6. Если тебя что-то не устраивает - пиши админам форума. Они отклоненные темы видят, и смогут вынести свой вердикт в твою пользу - если я не прав.
                                  Сообщение отредактировано: JoeUser -
                                      Цитата JoeUser @
                                      И простое бы предупреждение спасло - если бы была привычка ... смотреть логи сборки.

                                      Кхе-кхе. Всегда смотреть логи сборки это напряжно.
                                      У меня есть привычка, настраивать warning as error.
                                      Компилятор споткнувшись, возвращает код ошибки.
                                      А вот если при сборке возникла ошибка, то тогда у меня выскакивает отчёт.
                                      В прочих случаях нет смысла его читать. Разве что для отладки самого сборочного процесса.
                                      Человек должен делать то, что может сделать только он, всё остальное должна делать машина!
                                        Цитата Eric-S @
                                        Кхе-кхе. Всегда смотреть логи сборки это напряжно.

                                        Возможно я неточно выразился. Для разработки под С/С++ я использую QtCreator. У него для логирования сборки есть два окошка - сырых логов, и логов предупреждений и ошибок. Естественно, я сперва смотрю второе.

                                        Такие предупреждения, как неиспользуемые переменные - я обрабатываю чаще всего просто обычным комментированием переменных, хотя можно бы и прагмой, но это не всегда красивше.
                                        Мои программные ништякиhttp://majestio.info
                                          Цитата JoeUser @
                                          Возможно я неточно выразился. Для разработки под С/С++ я использую QtCreator. У него для логирования сборки есть два окошка - сырых логов, и логов предупреждений и ошибок.

                                          Ясно. У меня самопальная сборка. Окошко с ошибками открывается, только если при сборке были ошибки.

                                          Цитата JoeUser @
                                          Такие предупреждения, как неиспользуемые переменные - я обрабатываю чаще всего просто обычным комментированием переменных

                                          В смысле их удалением из компиляции?
                                          // int not_used_var;
                                          Я в таких случаях просто удаляю. Чтоб не плодить мусор. Если будет нужно вернуть, то svn или git мне поможет.

                                          Цитата JoeUser @
                                          можно бы и прагмой, но это не всегда красивше.

                                          В тех случаях, когда ни то ни сё, переменная нужна, но временно не используется, то использую макрос.
                                          Раньше там был просто:
                                          #define UNUSED( varname ) ((void) varname)

                                          Потом сделал шаблонную заглушку:
                                          template< typename T > void unused( const T& ) {}

                                          Сейчас в стандарте предложили атрибут, но я как-то даже не пробовал.
                                          Сообщение отредактировано: Eric-S -
                                          Человек должен делать то, что может сделать только он, всё остальное должна делать машина!
                                            Скрытый текст
                                            Цитата Eric-S @

                                            В тех случаях, когда ни то ни сё, переменная нужна, но временно не используется, то использую макрос.

                                            Зря ты это сказал. Сейчас Киля срач начнёт и на эту тему :crazy:
                                            Сообщение отредактировано: JoeUser -
                                            Подпись была включена в связи с окончанием срока наказания
                                                Скрытый текст
                                                Ну я на всякий случай - вдруг не заметишь такой повод, чтобы посраться, а тут я напомнил :yes:
                                                Сообщение отредактировано: JoeUser -
                                                Подпись была включена в связи с окончанием срока наказания
                                                  Цитата OpenGL @
                                                  Зря ты это сказал. Сейчас Киля срач начнёт и на эту тему :crazy:

                                                  Мне как-то не интересно читать срач.
                                                  Я знаю, что поступаю не очень хорошо, заглушая предупреждения, вместо исправления.
                                                  Но в некоторых случаях, это наиболее приемлемый вариант. А я перебрал множество разных.
                                                  Если кто-то может предложить более удобное, правильное и красивое решение, то с радостью откажусь от старого варианта.
                                                  Человек должен делать то, что может сделать только он, всё остальное должна делать машина!
                                                    Цитата Eric-S @
                                                    У меня есть привычка, настраивать warning as error.
                                                    Такая же фигня. Ненавижу непофикшеные предупреждения.
                                                    Скрытый текст
                                                    У Кили сейчас идеальная аватарка - полностью подходит под его поведение на этом форуме. :lol:
                                                    error: 'long long long' is too long for GCC
                                                      Цитата Eric-S @
                                                      В смысле их удалением из компиляции?
                                                      // int not_used_var;

                                                      Да, но я дополнительно использую еще QtCreator TODO Plugin, и помечаю ее как //NOTE , если точно знаю, что она скоро понадобится. Такие случаи очень редкие, но бывают.

                                                      А еще:

                                                      ExpandedWrap disabled
                                                        #include <iostream>
                                                         
                                                        class Warning {
                                                          public:
                                                            virtual void Log(const std::string &Msg) const {
                                                              std::cout << "Warning: " << Msg << std::endl;        
                                                            }        
                                                        };
                                                         
                                                        class Fatal: Warning {
                                                          public:    
                                                            void Log(const std::string & /** Msg **/) const override { // <--------- Бывает и такое
                                                              std::cout << "Abort." << std::endl;        
                                                            }        
                                                        };
                                                         
                                                         
                                                        int main() {
                                                          Fatal F;
                                                          F.Log("");
                                                          return 0;
                                                        }
                                                      Мои программные ништякиhttp://majestio.info
                                                        Цитата JoeUser @
                                                        А еще

                                                        Не понял, как это использовать на практике? Можно пример?

                                                        Добавлено
                                                        Цитата JoeUser @
                                                        Да, но я дополнительно использую еще QtCreator TODO Plugin, и помечаю ее как //NOTE , если точно знаю, что она скоро понадобится.

                                                        Ясно. Если что, я помещаю
                                                        /// @todo обработать переменную
                                                        А doxygen это всё собирает в единый список todo list.
                                                        Впрочем, это не слишком удобно и какая-нибудь прога не помешала бы.
                                                        Человек должен делать то, что может сделать только он, всё остальное должна делать машина!
                                                            Цитата Eric-S @
                                                            Не понял, как это использовать на практике? Можно пример?

                                                            Ну вот синтетический пример я и привел. Его конечно же можно было бы переписать с применением паттерна "Адаптер". Но для разовых решений, а тем более мелких - мой пример пишется быстрее и читается несложно.
                                                            Мои программные ништякиhttp://majestio.info
                                                                Цитата JoeUser @
                                                                вот синтетический пример я и привел.

                                                                Такое ощущение, что мы разговариваем о разном.
                                                                Для чего эти классы Warning, Fatal? Чтобы вывести отладочное сообщение?

                                                                А не проще ли тогда:
                                                                ExpandedWrap disabled
                                                                  #if defined(_DEBUG)
                                                                   
                                                                  inline void report_warning( const string& message )
                                                                  {
                                                                  clog << "Warning: " << message << endl;
                                                                  }
                                                                   
                                                                  #else // _DEBUG
                                                                   
                                                                  inline void report_warning( const string& )
                                                                  {
                                                                  }
                                                                   
                                                                  #endif // _DEBUG
                                                                   
                                                                   
                                                                  int main()
                                                                  {
                                                                  report_warning( "" );
                                                                  return 0;
                                                                  }


                                                                Вообще я обычно юзаю функции и макросы из microsoft crt. Там можно перенаправить вывод или обработать его разными способами. Но это если хочется извращаться.
                                                                А если нужна переносимость или простота, то вариант с inline функциями удовлетворяет потребности.

                                                                И мне бы хотелось понять, в чём плюшка, в чём профит от использования классов, да ещё с виртуализацией?
                                                                Человек должен делать то, что может сделать только он, всё остальное должна делать машина!
                                                                  Цитата Eric-S @
                                                                  И мне бы хотелось понять, в чём плюшка, в чём профит от использования классов, да ещё с виртуализацией?

                                                                  Не не не. Речь не о использовании классов же шла. Речь о подавлении сообщении о неиспользуемых параметрах.

                                                                  Если же речь именно про классы. Ну был у меня некогда проект на Qt5, в котором открывалась куча вложенных связанных диалогов. Задача была организовать корректную реакцию всех элементов всех диалогов на какое-то изменение. При этом часть диалогов имела идентичное отображение UI, но работала с разными моделями данных. Первое что я сделал, сделал классы-предки типовых UI, а от них наследовал конкретные реализации. В типовом классе-предке реализовал абстрактные методы GetСmd и PostCmd с параметрами (слоты). Так вот. В части реализаций данных методов изредка некоторые параметры не использовалась. Пришлось "научиться" подавлять вот таким вот образом сообщения о неиспользуемых параметрах с помощью /** **/

                                                                  Добавлено
                                                                  Цитата Eric-S @
                                                                  Вообще я обычно юзаю функции и макросы из microsoft crt

                                                                  Увы, я стараюсь не привязываться к платформе.
                                                                  Мои программные ништякиhttp://majestio.info
                                                                    Цитата JoeUser @
                                                                    Не не не. Речь не о использовании классов же шла. Речь о подавлении сообщении о неиспользуемых параметрах.

                                                                    Тфу! Точно. Теперь понял куда смотреть. Спасибо за пояснение. Название параметра осталось у потомка, но оно теперь закоментировано.
                                                                    Да, действительно, бывает такое. У меня в проекте тоже есть такие места.
                                                                    Но я использую макрос UNUSED.
                                                                    Если параметр удалить или закоментировать, то doxygen кидает warning, что у реализации метода, название параметра отличается от объявленого.

                                                                    Добавлено
                                                                    Цитата JoeUser @
                                                                    Увы, я стараюсь не привязываться к платформе.

                                                                    Спорное утверждение. Разрабатывать в qt creator и не привязываться к платформе?
                                                                    Теперь вы привязаны к платформе qt.
                                                                    Это конечно моё личное мнение, но она далеко не фонтан радости.
                                                                    Все проги написанные для десктопов с пользовательским интерфейсом на qt у меня вызывают много мата.
                                                                    Я их даже перестал устанавливать, как только читаю в описании упоминание про qt.
                                                                    Человек должен делать то, что может сделать только он, всё остальное должна делать машина!
                                                                      Скрытый текст
                                                                      На счет Qt меня устраивает многое, хотя исполняемые файлы - жЫрные до безумия. Это печаль.

                                                                      Цитата JoeUser @
                                                                      Разрабатывать в qt creator и не привязываться к платформе?

                                                                      А вот это можно вполне - там есть типы проектов "Без использования Qt". Линкуй чего хочешь. Я пробовал библиотеку Nana - вполне себе даже.
                                                                      Мои программные ништякиhttp://majestio.info
                                                                            Цитата Eric-S @
                                                                            Если параметр удалить или закоментировать, то doxygen кидает warning, что у реализации метода, название параметра отличается от объявленого.

                                                                            Но ведь с учётом возможности перегрузки методов, это предупреждение несколько странно. Я к тому, что перегрузка — штатная и часто используемая фича в языках, где она есть, т.е. таких предупреждений может выдаться крайне много и они будут захламлять действительно важные предупреждения, не?
                                                                            “Object-oriented design is the roman numerals of computing.” — Rob Pike
                                                                            All software sucks
                                                                            0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                                                            0 пользователей:


                                                                            Рейтинг@Mail.ru
                                                                            [ Script Execution time: 0,3087 ]   [ 17 queries used ]   [ Generated: 26.09.18, 02:53 GMT ]