• TDD/BDD в чем разница и для каких видов модулей стоит использовать?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    TDD

    - пишем тесты - маленький кусочек, то что можно минут за 10 написать. На этом этапе мы формулируем что мы хотим написать.
    - пишем код - пишем код, который делает тесты "зелеными". то есть все работает. Мы делаем это максимально быстро, самым тупым способом, который просто быстрее всего сделать.
    - рефакторинг - после того как все работает, или еще через пару итераций, что бы набралось чуть больше "грязи", чистим код поочередно. Важно при рефакторинге чистить что-то одно. Либо код, либо тесты (да да, их тоже надо рефакторить иногда устраняя дублирование). Поправили код - прогнали тесты, все хорошо? тогда можно тесты подправить. Ну и т.д.

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

    TDD - для одного разработчика, BDD - для команды. А BDD-style assertions для chai - это пафос. По сути это "планирование фич" в рамках библиотек и отдельных объектов. Чуть меньший масштаб. Но ничем от TDD вообще не отличается, хотя если сильно постараться можно так же оценивать ценность фич для пользователей нашей библиотеки и т.д.

    Как никак в BDD основная мысль - фичаспеки должен иметь возможность читать продукт оунер или стэкхолдеры, то есть те кому проект собственно нужен, что бы говорить должно работать так или нет. В случае с библиотеками... ну вы пишите что-то для девелоперов, а они в состоянии читать тесты как фичаспеку. И в принципе от предметной области недалеко.
    Ответ написан
    1 комментарий
  • Как так сделать в javascript?

    FMars
    @FMars
    Используйте функцию setInterval: https://jsfiddle.net/j29pf67j/1/
    var counter = document.getElementById("counter")
    var hiddenText = document.getElementById("hidden-text")
    var run = function(seconds) {
      var interval = setInterval(function(){
        if (seconds > 0) {
          counter.textContent = seconds--;
        }
        else 
        {
          hiddenText.style.display = "block";
          counter.style.display = "none";
          clearInterval(interval);
        }
      }, 1000)
    }
    Ответ написан
    Комментировать
  • Как центровать вкладки?

    @soledar10
    html css3 js jquery
    1. .nav-tabs - display: inline-block;
    2. <div class="col-sm-12 center-block"> задать класс text-center
    Ответ написан
    1 комментарий
  • Как центровать вкладки?

    ThunderCat
    @ThunderCat Куратор тега HTML
    {PHP, MySql, HTML, JS, CSS} developer
    95a9d86df37749e7acc04a5f0268a3a0.png

    Код в студию блин!
    Ответ написан
    1 комментарий
  • Почему PhpStorm не видит методы PDO?

    delphinpro
    @delphinpro Куратор тега PHP
    frontend developer
    phpStorm видимо не знает, что возвращает метод Connection::con()
    У вас там есть phpDoc?

    class Connection {
      /**
       *  @return \PDO;
       */
      public static function con() {
      }
    }
    Ответ написан
    1 комментарий
  • Добавить в корзину товары, которые парсятся с сайта поставщика?

    by25
    @by25
    Веб-разработчик
    В целом логичное решение. Но я бы немного доработал.
    В классе записи корзины (CartItem) добавляем поле "storage" (или типа того). Если 'local' - товар из текущей БД магазина, для поставщиков добавляем какой-то идентификатор. Выборку должен осуществлять, с учетом storage, наш репозиторий/менеджер/etc.
    Во время добавления в корзину, я бы не добавлял запись в БД. Исходя из нашего "storage" можно дергнуть товар у поставщика. Но не совсем эффективно делать каждый раз запрос. Поэтому результаты запросов к api поставщиков кэшируем (файл-кэш, редис, мемкэш и т.д.). А при оформлении заказа, уже нужно инсертить товар внешнего поставщика. Причем можно пересмотреть структуру таблицы "Товары заказа", как-то так:
    storage, order_id, product_id, quantity, price_unit...
    Ответ написан
    1 комментарий
  • Что делают __set и __get?

    @Silm
    Небольшая экскурсия в ооп
    class SomeClass { // это класс SomeClass
         private $member;  // это закрытое свойство $member;
         public $foo;  // это публичное свойство $foo;
    
         function __set($name, $val) { // это метод __set()
    
           $this->member[$name] = $val;   // это сохранение значения в свойство $member;
    
         }
    
         function __get($name) { // это метод __get()
      
          return $this->member;  // это получение свойства $member;
    
         }
    }
    
    $SomeObj = new SomeClass(); // это мы создали объект
    $SomeObj->foo = 'bar'; //  это мы записали в свойство $foo строку
    $SomeObj->baz = 'ups'; // это мы хотели записать строку в свойство $baz, но стоп, у нас ведь нет такого свойства!

    Но зато есть метод __set(). Именно в него попадет имя неопределенного в классе свойства, в которое мы попытались что то записать и записываемое значение заодно. Таким образом мы могли бы трактовать этот код так:
    $SomeObj->member['baz'] = 'ups';
    Ну, не учитывая, что свойство member у нас приватное и так обратиться к нему невозможно...

    То есть, другими словами, этот код занимается следующим: складывает в $member имя и значение неизвестного свойства, в которое мы пытаемся что то записать. А при попытке получения неизвестного свойства нам возвращается весь массив $member. Что, кстати, не логично. __get() должен был бы выглядеть так:
    function __get($name) { 
      
          return $this->member[$name];  
    
         }

    теперь мы получаем не все содержимое $member, а только содержимое того ключа, в который ранее (по идеи) что то записали.

    Читайте доку, кстати.
    Ответ написан
    3 комментария
  • Что делают __set и __get?

    ThunderCat
    @ThunderCat Куратор тега PHP
    {PHP, MySql, HTML, JS, CSS} developer
    Если в классе не доступно какое-либо свойство напрямую(например с помощью модификатора доступа private) можно определить "обходной путь" - "магическую" функцию __set(), в которую автоматически будет попадать любая попытка доступа к приватной переменной. Что делать с этими данными программист решает сам(реализует в теле метода).
    Ответ написан
    2 комментария
  • Что за странный символ?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега PHP
    Может, у вас не из-за странного символа вёрстка плывёт, а из-за того, что вы закрываете там несуществующий тег dir?
    Ответ написан
    3 комментария
  • Вывод тайтла (PHP, MVC)?

    @mistergonza
    PHP6 evangelist
    Представление должно подключать главный шаблон, а не наоборот. Посмотрите как это делает twig, или как это сделано в Zend Framework 2.
    Ответ написан
    5 комментариев
  • Prepare statement для like?

    iNickolay
    @iNickolay
    Это особенность подготовленных выражений. Должно быть так:
    prepare...('SELECT * FROM table WHERE field LIKE :like ...');
    $bind['like'] = '%' . $myVar . '%';
    Ответ написан
    Комментировать
  • Базовая модель в MVC (php). Что именно она делает?

    dmitriylanets
    @dmitriylanets
    веб-разработчик
    что значит грамотно? раз вы наследуетесь от Model то явно часть функционала реализована там, как правило CRUD методы, и далее уже как вам нравится реализуйте функционал например так:
    abstract class Model{
    	
    	protected $table;
    	
    	protected $key;
    			
    	function findAll(){
    		return $this->fetch("SELECT * FROM `{$this->table}`");
    	}
    	
    	function findById($id){
    		return $this->fetch("SELECT * FROM `{$this->table}` WHERE {$this->key} = {$id}");
    	}
    
    
    	protected function fetch($query)
    	{
    		$stmt = Connection::con()->query($query);
            $stmt->setFetchMode(\PDO::FETCH_ASSOC);
            $data = $stmt->fetch();
            return $data;		
    	}
    	
    }
    
    class News extends Model {
    
    	protected $table = 'news';
    	
    	protected $key = 'id';
    
    	public function allNews() {
            if(!$rows = $this->findAll()){
    		throw new \Exception('not find news');
    		}
    		return $rows;
        }
    
    }
    Ответ написан
    1 комментарий
  • Почему PHP7 много потребляет памяти?

    erniesto77
    @erniesto77
    oop, rb, py, php, js
    memory_get_usage - Возвращает количество памяти выделенной PHP, а не потребление памяти
    Ответ написан
    1 комментарий
  • Как быстро отредактировать статический сайт?

    Грузите страницу, разбираете, пишите парсер в который вносите все правила, что искать и на что исправлять, говорите ему "фас" :)

    Либо ищите редактор, который сможет сравнить файлы между собой и выделить общие фрагменты, правите их с сохранением изменений во всем проекте.
    Ответ написан
    Комментировать
  • Как проверить геотаргетинг?

    sim3x
    @sim3x
    dev.maxmind.com/geoip/legacy/geolite

    вообще не стоит такие вещи оставлять на автоматику - определи местоположени пользователя по ип, потом дай ему возможность указать, откуда он на самом деле
    Ответ написан
    Комментировать
  • Как проверить геотаргетинг?

    dimonchik2013
    @dimonchik2013
    non progredi est regredi
    1) ставишь sypexgeo.net
    2) берешь список прокси
    3) прогоняешь через список, грабя город
    4) сравниваешь
    5) PROFIT!!!

    процент ошибок для регионов порядка 20%, опять же, зависит от траффика
    Ответ написан
    Комментировать
  • Есть ли русскоязычные ресурсы для изучения PHP 7?

    @Silm
    Изучение PHP7 ничем не отличается от PHP5. Точнее, изучение PHP7, после PHP5 будет заключается в прочтении "что нового".

    Релиз удачный. Прирост в производительности есть. Значительный.

    getjump.me/ru-php-the-right-way
    Ответ написан
    2 комментария
  • Подкрепить/улучшить знания базового уровня php?

    Immortal_pony
    @Immortal_pony Куратор тега PHP
    Ответ написан
    Комментировать
  • Хороший обфускатор js. Есть такие?

    @serebro
    aaencode посмотрите, есть реализации для разных языков
    Ответ написан
    Комментировать
  • Хороший обфускатор js. Есть такие?

    @SanSYS
    jsfuck.com - самый лучший обфускатор, он позволил на ebay скрипт внедрить )
    Ответ написан
    Комментировать