Ответы пользователя по тегу Программирование
  • Стоит ли учить пхп новичку?

    Есть подозрение, что толком на JS вы ничего не писали, а значит программировать по сути не умеете. Тогда не считаю PHP хорошим языком в качестве почти первого.

    Если у вас цель сделать хоть что-то конкретное на сервер-сайде, то PHP идеален, как голый, так и в виде кучи готовых движков (не путать с фреймворками). Если цель разобраться, что и как происходит на сервер-сайде, то годится любой современный язык, на котором можно написать CGI-приложение, а лучше HTTP-сервер (на PHP можно). Если же цель освоить современные принципы высокоуровневой разработки, реализации бизнес-логики, а не борьбы с нюансами, то начав с PHP вы рискуете за деревьями не увидеть леса — слишком много особенностей собственно языка придётся иметь в виду. Тут порекомендую почти как lightman (Java, .NET, Python), но исключив Ruby — он слишком хорош для первого языка :), переходить на какой-то другой из «мэйнстримовых» будет мучением. Освоив принципы на одном из этих трёх языков вы потом легко сможете освоить PHP на любом уровне, хотя и будете часто материться :(

    P.S. Если что PHP основной язык более десяти лет, но он был далеко не первым, а первую свою программу для веба писал на голом Си (почти голом, CGI использовал, HTTP сервер не писал).
    Ответ написан
    Комментировать
  • Вопросы, которые вы не узнали в школе/вузе, но стоило бы знать? (из сферы IT)

    На нынешних уроках информатики, я бы после общих принципов работы компа давал бы общие принципы работы сетей вообще и www (http) в частности, чтобы было базовое понимание, что такое адрес, порт, протокол, прокси, нат, белый, серый, чёрный IP, днс и т. п. В общем чтобы понимали процессы происходящие при наборе адреса в адресной строке браузера (и знали, что это такое вообще).

    На кружке бы на http более сильно заострился, вплоть до разработки простейших http серверов на чём-то вроде node.js, скрывая детали типа сокетов, но раскрывая процесс работы по http вплоть до «ручного» разбора запросов и формирования ответов.
    Ответ написан
    Комментировать
  • Кеширование данных "правильнее" описывать в модели или контроллере?

    В репозитории. Модель простой POPO, о БД вообще ничего не знает, её единственная область ответственности — моделировать предметную область. Ответственность репозитория — хранить сущности модели, где и как только он знает. Как вариант, да, прокси, реализующий тот же интерфейс, что и «чистый» репозиторий. Другой вариант — кэшировать результаты запросов ещё ниже, где-то на уровне DBAL/DAL. Но на практике только прямо в репозитории реализовывал, что-то вроде

    class UserRepository {
      public function getById($id) {
        if ($this->cache->hasKey('user' . $id)) {
          $user = $this->cache->getByKey('user' . $id);
        } else {
          $user = $this->db->getUserById($id);
          $this->cache->set('user' . $id, $user);
        }
    }
    
    Ответ написан
    Комментировать
  • Как придти к автоматическому тестированию?

    Подумайте какие сценарии использования вашего модуля могут быть, что поступает на вход и что должно быть на выходе. Вход и выход это не только параметры конструктора/методов и возвращаемое return значение, но и состояние БД, ФС и т. п., а для выхода ещё и исключения. Для каждого сценария подготавливаете с нуля вход (создаёте нужные объекты рантайма, файлы, схему и данные в БД), выполняете сценарий (в простейшем случае вызов одного метода) и проверяете выход.

    Если архитектура не заточена под тестирование, то, скорее всего, тесты будут большие, хрупкие и медленные, ведь кроме вашей собственной логики они будут проверять логику системы, фреймворка,, библиотек, ОС и т. п. Наступает время рефакторинга с целью облегчения тестирования. Скажем все файловые операции в тестируемом модуле выделяете в методы отдельного класса FileSystem, который передаётся вашему модую в параметрах или контейнере. Убеждаетесь, что первая группа тестов всё ещё работает после рефакторинга, копируете её как новую группу и начинаете заменять в ней реальные вызовы на фэйковые, моки и стабы. Получаете более лёгкие тесты. Как-то так.
    Мне в своё время очень помогла книга Эффективная работа с унаследованным кодом
    Ответ написан
    Комментировать
  • Какие языки программирования преподавать?

    Любой мультипарадигменный язык, на котором можно показать процедурную, модульную, функциональную и ООП парадигмы. Ведь курс называется «основы программирования», а не «основы императивного и/или ООП программирования» как подразумевают многие. Личные симпатии в сторону Python. IDE не принципиальна вплоть до отсутствия. Это что касается ПКС (230115?)

    Со второй сложнее, стандарта именно на экономику не нашёл (интересно только я один догадался их посмотреть, прежде чем отвечать? :) ), но если не завязываться на вендора (1С, МС), то альтернатив кроме Python тоже в голову не приходит.
    Ответ написан
    1 комментарий
  • Посоветуйте IDE для школьников

    Не уверен, что обойдётся только if и переменными, но в голову приходит только MonoDevelop и C# из линуксового/кроссплатформенного визуального и востребованного. Qt Creator формы, конечно, рисовать умеет, но всё же не для детей имхо C++ с надстройками. Можно ещё попробовать Qt Creator вместе с PyQt/PySide но тоже не уверен, что возможно обойтись только переменными и if.
    В общем посмотрите (в порядке убывания субъективных предпочтений, IDE/язык):
    MonoDevelop/C#
    Qt Creator/Python(PyQt)
    Qt Creator/C++

    Хотя, может имеет смысл и Qt Creator/Python(PyQt) на первое место поставить — динамическая типизация всё же проще по идее, и сам код не такой «грязный» — ни скобочек для структуры, ни классов вроде System.Windows.Documents.DocumentStructures.ListItemStructure в типах переменных и параметров (да простят меня знатоки .NET за некорректность примера)
    Ответ написан
    1 комментарий
  • Являются ли заголовочные файлы предметом интеллектуального права?

    1. Да
    2. Нет
    3. Непонятен смысл вопроса, то ли вы хотите прелинковать к своей программе какую-то библиотеку, для которой есть .h файлы, то ли хотите написать свою реализацию этой библиотеки, совместимую по интерфейсу, то ли просто сделать аналог со схожими реализацие и интерфейсом.
    Ответ написан
    1 комментарий
  • Реакция на изменение состояния объекта

    Если гибкость (другие методы, включая других обхектов, не один метод и т. п.) не важна, то вполне нормальное решение, имхо. Единственный нюанс, что отслеживаете присваивание, а не изменение. Следуя букве задачи и абстрагируясь от языка перед присваиванием и вызовом сначала нужно сравнить, а не присваивается ли то же самое значение и, соответственно, лишний раз вызывается метод, а если нет то и не присваивать, и не вызывать.
    Ответ написан
    Комментировать
  • Читаете ли вы толмуты по программированию в 1000-с лишним страниц от "корки до корки"?

    Главы по каким-то специализированным вещам на практике мне не нужным (например, разработка десктопных UI или работа с экзотической БД типа MS SQL :) ) только по диагонали глазами пробегу.
    Ответ написан
    Комментировать
  • Проект в одиночку. Как?

    Ну и пишите в тесте что-то вроде

    result = MySuperClass::runSuperAction();
    assertEqual(result, 'Expected result');

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

    Научиться программировать самостоятельно «по книжкам», имхо, вполне реально. Но нужен реальный (или близкий к нему) проект, а не отрывочные учебные задачи, какие обычно предлагаются в книгах. То есть после начального вхождения в язык ставим себе задачу и начинаем её реализовывать. Важно реализовать до пригодного в продакшен вида (пускай не будет каких-то интересных фич, но те, что есть должны быть закончены, а не «всё равно никто никогда не увидит, потому входные данные проверять, а выходные экранировать не буду»). Очень желательно иметь качественный фидбэк на свой код (вариантов — тьма).

    Для начального обучения хорошо подходят, по-моему, Python (+Django если говорить о вебе) или Ruby (+RoR в вебе), на худой конец PHP. Компилируемые языки со статической типизацией, по-моему, приводят начинающего программиста в ситуации, когда за деревьями не видно леса — заставляя уделять много внимания формальной правильности они способствуют снижению внимания на логическую правильность.
    Ответ написан
    Комментировать
  • Как защитить свой код на PHP от стороннего использования?

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

    В общем, имхо, технические средства защиты кода (тем более для интерпретируемых ЯП) могут использоваться лишь для усложнения нелегального использования, от целенаправленной атаки они не спасут. Основная защита должна быть юридическая — для начала Государственная регистрация программы для ЭВМ или базы данных
    Ответ написан
    3 комментария
  • Как запрограммировать набор условий возникновения события?

    Когда-то (но это было давно и не правда) решил схожую подзадачу так: в GUI формировался запрос (дерево либо с листьями «параметр, операция, значение[, значение2[, значение3[ ...]]]]», либо поддеревья с «корнем» «И»/«ИЛИ», после нажатия кнопки «Сохранить» или «Выполнить» он сохранялся как дерево для последующего редактирования и дополнительно рекурсивно преобразовывался в SQL выражение (подзадача была сделать конструктор отчётов по довольно обширной БД анкет, спрятав от пользователей SQL да и вообще табличную природу БД). Если у вас выражения не в SQL в итоге преобразуются, а язык интепретируемый, то можно воспользоваться схожим принципом — получать в виде дерева от интерфейса, если нужно хранить для последующего редактирования/вывода, то сохранить дерево, а главное сгенерировать на вашем ЯП выражение, а потом выполнить его через функцию, во многих языках называемой eval().
    Ответ написан
    Комментировать
  • Каковым должен быть объём изменений в программе, чтобы считать результат не багфиксом/расширением возможностей, а другой программой?

    В личных или маркетинговых целях можно считать как угодно, лишь бинароное сравнение показало хоь одно различие, а вот в юридических (определение авторства и т. п.) формально даже если одну строчку с копирайтом найдут будет считаться нарушением. Вообще, насколько я знаю, это решает экспертиза без формальных критириев, учитывается всё от полного совпадения участков кода (включая комментраии) до алгоритмов и архитектуры. Эксперты руководствовуются тем, что не могут два человека мыслить одинаково.
    Ответ написан
    Комментировать