• Нормализация БД. Зло или добро?

    pi314
    @pi314
    Президент Солнечной системы и окрестностей
    Нормализация ради нормализации - зло в подавляющем большинстве случаев! Нормализация, как часть продуманного проектирования или рефакторинга модели данных - однозначно добро. Структура БД должна быть, по возможности, оптимальной для запросов, выполняемых на ней приложением, а вовсе не соответствовать какой-то там нормальной форме :) Это "оптимально" может в каждом конкретном случае зависеть от кучи факторов, начиная от самих запросов и особенностей конкретной использованной СУБД, и вплоть до объемов доступной памяти и скорости обращения к диску.
    Ответ написан
    Комментировать
  • Почему тег div такой популярный?

    bootd
    @bootd Куратор тега HTML
    Гугли и ты откроешь врата знаний!
    Это единственный тег, предназначенный для построения шаблона! Это как кирпич для строительства зданий. Вы просто расставляете при помощи него элементы на сайте. Чего тут не ясно! Взяли, да загуглили, что это за тег такой!

    Есть еще несколько элементов, например main, section, article, aside. Они тоже могут использоваться для построения шаблона, но, они как бы сказать узконаправленные, если исходить из семантики, нежели div!
    Ответ написан
    4 комментария
  • Какой компрессор css использовать что бы при сжатии не удалял комментарии?

    gunlinux
    @gunlinux
    Freelancer
    gulp + sourcemaps
    gulp.task('styles', function () {
        return gulp.src('style.css')
            .pipe(sourcemaps.init())
            .pipe(minifyCss())
            .pipe(sourcemaps.write('.'))
            .pipe(gulp.dest(output + '/css'))
    });


    Оно хоть и потрет комментарии, но сгенерить source map и в инспекторе все увидим, я правильно понял, что задача в этом?

    https://github.com/jakubpawlowicz/clean-css#how-to... он же поддерживает опции оставить комментарии
    Ответ написан
    3 комментария
  • Можно простыми словами объяснить принцип работы метода Apply в Java Script?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега JavaScript
    methods.init.apply(this, arguments);
    Здесь метод init объекта methods вызывается c переопределенным контекстом this и в него передаются все аргументы, которые были переданы в функцию easyFader.

    Проще, вроде, некуда.
    Ответ написан
    Комментировать
  • Зачем нужно знать машинный код?

    Denormalization
    @Denormalization
    Раньше, во времена *.com файлов, было модно прийти на тусовку, и прям в debug.exe написать програмку в машинных кодах, и все такие "АХ!!1"

    Но вообще да, это всё выдумки режисеров и сценаристов. Никто не пишет в машинном коде. Да, для reverse engineering можно запомнить несколько опкодов, но по большей части это никому не надо. (0.0001% кому это нужно - погрешность).
    Ответ написан
    1 комментарий
  • Зачем нужно знать машинный код?

    saboteur_kiev
    @saboteur_kiev Куратор тега Программирование
    software engineer
    Конкретно сейчас машинный код знать наизусть не обязательно - полно дизассемблеров, которые переведут код для тебя.
    Иметь представление о машинном коде чтобы понимать, как программа хранится и выполняется - обязательно для любого уважающего себя программиста, работающего с языками близкими к С.
    Особенно полезно иметь представление для работающих с embedded и другими железками
    Ответ написан
    Комментировать
  • Как быть с поддержкой свойств в JS?

    Taraflex
    @Taraflex
    Ищу работу. Контакты в профиле.
    Использовать babel + не забыть подключить https://babeljs.io/docs/usage/polyfill/
    Ответ написан
    Комментировать
  • Почему такой вариант работы с DOM считается темной стороной силы?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега JavaScript
    Потому что операции работы с DOM затратны по ресурсам и времени. Если элемент в DOM еще не добавлен, изменять его гораздо дешевле.

    Но в вашем конкретном случае это нормально - вы же работаете со всеми ячейками строки, а не с одной создаваемой. Разве что добавление кнопки "Добавить в корзину" лучше сделать сразу в создаваемую ячейку, тогда и искать ее не надо будет и на операциях с DOM сэкономите.

    Я бы переписал так:
    var classes = ['item-id', 'item-title', 'item-price'],
        table = document.getElementById('table'),
        rows = table.getElementsByTagName('tr'),
        rowIndex, cellIndex, cells, currentRow, currentCell, addToCartCell;
    
    // Пропускаем первую строку, потому что в ней находится заголовок таблицы
    for (rowIndex = 1; rowIndex < rows.length; rowIndex++) {
        currentRow = rows[rowIndex];
        cells = currentRow.getElementsByTagName('td');
    
        for (cellIndex = 0; cellIndex < cells.length; cellIndex++) {
            currentCell = cells[cellIndex];
            currentCell.setAttribute('class', classes[cellIndex]);
        };
    
        addToCartCell = document.createElement("td");
        addToCartCell.innerHTML = '<a class="add_item">Добавить в корзину</a>';
        currentRow.appendChild(addToCartCell);
    };

    Обратите внимание, что упростив код и дав понятные названия переменным, мы избавились от необходимости его комментировать.
    Многие разработчики (и я в их числе) считают необходимость в комментариях признаком плохого кода. Комментировать можно и нужно зачем мы что-то делаем, но что код делает, должно быть понятно из него самого.
    Я оставил один полезный комментарий в качестве примера.

    Помимо этого, мы перенесли объявления переменных в самое начало условной функции, поскольку это широкораспространенное соглашение, облегчающее понимание кода.

    Можно было бы пойти чуть дальше и разбить код на маленькие независимые функции:
    function getTable() {
        return document.getElementById('table')
    }
    
    function getRows(table) {
        var allTableRows = table.getElementsByTagName('tr'),
            rows = [],
            index;
    
        // Пропускаем первую строку, потому что в ней находится заголовок таблицы
        for (index = 1; index < allTableRows.length; index++) {
            rows.push(allTableRows[index]);
        }
    
        return rows;
    }
    
    function appendAddToCartButton(row) {
        var cell = document.createElement("td");
        cell.innerHTML = '<a class="add_item">Добавить в корзину</a>';
        row.appendChild(cell);
    }
    
    function setCellsClasses(row) {
        var classes = ['item-id', 'item-title', 'item-price'],
            cells = row.getElementsByTagName('td'),
            index;
    
        // Обратите внимание, что здесь мы итерируем по классам, а не по ячейкам
        // В том случае, если в функции prepareTable кто-то по ошибке
        // поменяет местами строки добавления классов и кнопки добавления в корзину
        // код не сломается
        for (index = 0; index < classes.length; index++) {
            cells[index].setAttribute('class', classes[index]);
        }
    }
    
    function prepareTable() {
        var table = getTable(),
            rows = getRows(table),
            rowIndex, currentRow;
    
        for (rowIndex = 0; rowIndex < rows.length; rowIndex++) {
            currentRow = rows[rowIndex];
            setCellsClasses(currentRow);
            appendAddToCartButton(currentRow);
        }
    }
    
    prepareTable();

    Но в данном случае, скорее всего, это уже излишне.
    Ответ написан
    Комментировать
  • Книги vs оф. документация vs статьи vs видеокурсы: как лучше всего изучать новую технологию, или фрейворк?

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    По библиотеке или фреймворку:
    1. Схема архитектуры и её понимание,
    2. hello world (код) и разбор ("наложение") кода на архитектурную схему.
    3. Понимание базового архитектурного "скелетона" приложения.
    4. Беглый взгляд по функциям OOB (out-of-box/"из-коробки")
    5. Просмотр возможности подключения плагинов и беглый взгляд по текущему списку и реализуемых ими функций.
    ------------
    Постановка себе задачи и начало реализации на изучаемом инструменте.
    Ответ написан
    Комментировать
  • Вы тоже постоянно всё забываете из программирования?

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    Нет.
    Проект должен иметь ЯВНУЮ структуру на основе директорий и краткое описание назначения папок (на крайний случай) и быть понятным по структуре папок.
    Если проект достаточно сложный - оставляйте в корне схемку архитектуры в графическом файле.
    Ответ написан
    Комментировать
  • Как реализовать параллельные вычисления?

    @aleks_raiden
    Для такой задачи очень хорошо подойдет Go - можно по отдельной горутине для каждого из обьектов завести и обсчитывать
    Ответ написан
    Комментировать
  • Как работает MVC controller?

    ppokrovsky
    @ppokrovsky
    Ответственность контроллера в MVC:
    1. Получение параметров из представления (GET/POST итд) и передача их в модель
    2. Возврат представления с параметрами, полученными из модели
    3. Валидация и фильтрация параметров в обе стороны
    4. Контроль доступа на основании правил, заложенных в модели

    То есть контроллер - это посредник между представлением и моделью. Контроллер по возможности не должен содержать бизнес-логику. Представление по возможности не должно вызывать методы модели напрямую, модель gо возможности не должна содержать примеси представления (HTML) и возвращать представление. "По возможности" - так как не всегда это возможно/оправдано с точки зрения трудозатрат разработки.

    Общее правило: тонкий контроллер и толстая модель.

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


    Специфика веб-приложений в том, что на каждый запрос клиента создается новый экземпляр приложения, так как HTTP(S) - протокол без сохранения состояния (stateless).
    Для всех клиентов существует один общий класс контроллера (class myController), но на каждый запрос каждый клиент получает собственный экземпляр контроллера (new myController)

    если один пользователь запросит экшен1, а второй пользователь после этого запросит экшен2 - не может ли он получить значение "9"?


    нет, второй пользователь получит 5, так как взаимодействует с собственным экземпляром контроллера.
    Ответ написан
    2 комментария
  • Как сделать свои собственные лайки на сайте?

    Taraflex
    @Taraflex
    Ищу работу. Контакты в профиле.
    Если сайт не очень популярный, то хватит следующих скриптов для исключения возможности проголосовать дважды.

    https://github.com/Valve/fingerprintjs2
    +
    https://github.com/samyk/evercookie/ (перед установкой переименуйте все скрипты, чтобы не блокировались adblock-ом)

    Про привязку к ip забудьте.
    Ответ написан
    1 комментарий
  • Как правильно организовать Git репозиторий?

    Изучите gitflow.
    Скорее всего эта методика будет для вас избыточна, но основные приемы вроде: "отдельная ветка на каждую задачу" или "стабильный мастер + develop для разработки" определенно пойдут на пользу.
    Ответ написан
    2 комментария
  • Как правильно организовать Git репозиторий?

    saboteur_kiev
    @saboteur_kiev Куратор тега Git
    software engineer
    git изначально был спроектирован так, что ветки практически ничего не весят.
    Пользуйтесь ветками так, как вам удобно.

    В идеале сделайте одну ветку master, куда заливаются уже проверенные "красивые" коммиты для отчета, и develop, в которую заливаете коммиты для проверки уже общих изменений. А локально каждый девелопер может себе хоть на каждый новый таск делать ветку, которую затем мержить в develop
    Ответ написан
    Комментировать
  • Какая разница между C, C#, C++?

    @dmitryKovalskiy
    программист средней руки
    Разница в количестве плюсиков. У первого -0 , у второго - 4, у третьего - 2. Новичку лучше учить C++. А если серьезно : С- язык низкого уровня для системного программирования, драйверов и другой низкоуровневой разработки. С++ - тоже самое с обвесами из классов, перегрузок, шаблонами и некоторыми другими фичами. С# - ООП язык для разработки под .NET - Microsoft-стек технологий для разработки самых разных приложений.
    Ответ написан
    Комментировать