• Как научиться проектировать программы в ооп стиле?

    EvgenyMamonov
    @EvgenyMamonov
    Senior software developer, system architect
    Посмотрите в сторону предметно ориентированного проектирования (DDD).

    - https://habr.com/ru/post/269589/
    - https://habr.com/ru/post/269893/
    - https://habr.com/ru/post/267125/

    Хорошие книги по этой теме:
    - Роберт Мартин "Чистый код Создание, анализ и рефакторинг"
    - Роберт Мартин "Чистая архитектура"
    - Стив Макконнелл "Совершенный код"

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

    Еще очень хороший вариант - найти опытного разработчика и попросить его сделать review вашего кода, чтобы он объяснил вам как вот тут лучше сделать, а как там можно было сделать и почему именно так будет лучше.
    Ответ написан
    4 комментария
  • Как вернуть значение ключа словаря, который находится в вложенном словаре?

    @MAGistr_MTM
    Учусь программировать
    for response in content['response']:
       print(response.get('city', {}).get('title', ""))
    Ответ написан
    Комментировать
  • Равны ли два условия?

    ri_gilfanov
    @ri_gilfanov
    Web- and desktop-developer
    1. Чем является условие if start: # Что этов приведенном ниже коде?

    1. В общем виде, выражение вида if variable: по-умолчанию заменяет примерно такую конструкцию:
    if (
        variable is not None  # ни ничего
        and variable is not False  # ни ложь
        and variable != 0  # ни ноль
        and variable != ''  # ни пустая строка
        and variable != []  # ни пустой список
        and variable != {}  # ни пустой словарь
        and variable != tuple()  # ни пустой кортеж
        and variable != set()  # ни пустое множество
    ):

    В лекциях и литературе, это порой называют термином falsy -- логичный набор значений для встроенных типов, которые в выражении if variable: эквивалентны False. В качестве наглядного примера, if my_list: для проверки на пустой список [] писать гораздо удобнее, чем if len(my_list) != 0:.

    В вашем случае, условие if start: исключает срабатывание вложенного кода, как при пустой строке '', так и при None.

    2. Соответственно что передается при вводе пустого Enter?

    2. Передаётся пустая строка '', что затем "присваивается" переменной start. И так как условием выполнения цикла while является start != '', то в данном коде ввод пустой строки является способом выхода из цикла.

    3. Чем является пустая строка, ведь она ни False, ни True, ни None

    3. Пустая строка '' имеет тип str. Однако, см. выше про falsy значения.

    В общем, выражение if start: покрывает и проверку if start != '':, и ряд других проверок, описанных в пункте 1.
    Ответ написан
    5 комментариев
  • Равны ли два условия?

    dimonchik2013
    @dimonchik2013
    non progredi est regredi
    1) if start: экивалентно if start is not None

    2) передается пустая строка, сделай принт - хз есть там символ перевода или нет, наверно, нет

    3) сделай принт type(y) увидишь что тип у нее не boolean (это где тру фалс) и не нон - она же есть
    Ответ написан
    4 комментария
  • Зачем нужен @classmethod?

    longclaps
    @longclaps
    Но почему я не могу написать метод from_string так:
    cls вместо явного Date позволит наследнику Date (напр. AztecaDate - дата по календарю ацтеков) порождать именно AztecaDate.
    Кстати, есть одна тонкость, связанная с реализацией ООП на разных языках. C++ позволяет реализовать несколько разных, но одноимённых конструкторов класса с разной сигнатурой (набором аргументов), например, можно сделать так:
    Date(1, 1, 2019) # конструктор с сигнатурой (int, int, int)
    Date("1.1.2019") # другой конструктор с сигнатурой (str)
    В питоне можно добиться подобного, но ручками, анализируя состав аргументов Date.__init__, что неудобно, громоздко и нунафиг. Уж лучше забабахать Date.from_string. Но это неизбежно в динамическом языке - ведь C++ должен знать всё про аргументы конкретных вызовов конструкторов на этапе компиляции, а мы можем в рантайм творить что угодно )))

    для чего нужен staticmethod, если это уже не метод, а просто функция, и я могу вынести ее из класса.
    Да, можете. Я думаю, тут действует логика лучшей читаемости и логика экономии пространства имён:
    • Date._статикметод1 хоть и неочевидно что делает, но точно имеет отношение к Date
    • При импорте from date import * вы не получите охапку непонятных имён.

    Кстати, это не бесплатно - обращение к квалифицированному имени каждый раз создаёт дополнительный опкод LOAD_ATTR. Поэтому любители выжать максимум производительности (ну бывает полезно в глубоком цикле) используют такой трюк:
    # медленно
    l = []
    for i in range(100500):
        l.append(i)
    # чуть быстрее )))
    push = l.append
    for i in range(100500):
        push(i)
    Ответ написан
    2 комментария
  • Что читать про интеграцию REST, SOAP, JSON, RMI и т.д для аналитика, который в этом ничего не понимает?

    Вам не хватает фундаментальных знаний, в данном случае вам сильно помогло бы представление о модели ISO/OSI + основные представления о классах и объектах.

    Если вы прочитаете про модель ISO/OSI вам достаточно легко будет понять, что упомянутые сущности относятся к разным уровням. В данном случае можно выделить несколько уровней уровней:

    1. Сетевое соединение - способ установить соединение между двумя приложениями (например клиентским и серверным). Сокет является представлением такого соединения на уровне операционной системы и приложения (т.е. этим пняием оперирует разработчик пишущий сетевое приложение).
    2. Прикладной протокол - описывает взаимодейтвие клиента и сервера, чаще всего через установленное сетевое соединение (т.е. с програмной точки зрения через сокет). Например, HTTP или SMTP. Т.е. прикладные протоколы находятся над сокетами.

    сокеты и сетевые протоколы относятся к модели ISO/OSI

    3. Форматы обмена данных. Есть несколько универсальных форматов позволяющих описывать практически любые данные. К ним относятся, например, XML и JSON. JSON является альтернативой XML (он несколько проще и компактней). По JSON и XML есть соответствующие стандарты.
    Данные в этих форматах могут храниться или пердаваться поверх прикладных протоколов (например поверх HTTP).

    4. Модели данных (классы). Модель данных описывает определенный класс данных. Например, заказ. Она определяет какие свойства есть у заказа (дата, сумма, товар, покупатель, продавец, дата доставки и т.д.). Модели данных бумают универсальные и бывают разработанные под конкретное приложение. Существуют различные стандарты описывающие модели данных и связи между ними - XML schema, JSON-LD. Универсальные модели данных можно найти на schema.og. Разработчики приложения могут создать свою модель данных. Модели данных могут быть описаны как для XML так и для JSON.

    5. API (программные компоненты) использующие модели данных. В частности SOAP и REST API. При этом SOAP является стандартом на подобные API и используется обычно для универсальных интегрируемых между собой компонент, SOAP использует XML. REST API это достаточно условный термин, который может быть применен практически к любому API который принимает или отдает структурированные данные (как поверх XML так и поверх JSON). SOAP ближе к объектной модели данных, REST API ближе к классическому API и используется для простых клиент-серверных приложений.
    WSDL просто один из элементов SOAP.
    Т.е. SOAP работает поверх XML schema поверх XML поверх HTTP (например) поверх соединения через сокет.

    RMI в целом можно отнесети сюда же, но он менее универсальный, т.к. привязан к JAVA и использует внутренние бинарные представления данных а не какой-либо универсальный формат представления данных.

    последние три уровня не относятся к модели ISO/OSI, это уже из область прикладной разработки / дизайна.

    Вопрос про HD-фильм это вопрос из области можно ли переслать слона по почте. Через сокет можно передавать любые данные, в XML/JSON тоже можно упаковать любые данные, по прикладному протоколу тоже можно пердать любые данные и т.д. Более того, есть DLNA который фактически является REST API поверх XML и поддерживается любым современным телевизиром именно для передачи фильмов, в т.ч. HD. Т.е. создать конкретную реализацию приложений которая будет поддерживать HD фильмы можно, но ожидать что любая реализация SOAP/REST API поволит передавать HD фильмы нельзя, они делаются под определенные задачи.
    На практике как правило есть конкретная реализация и ограничения, например на размер POST запроса или размер письма (SOAP может использовать SMTP, не только HTTP).
    Ответ написан
    Комментировать
  • Возможно ли присвоение элементу строки внутри кортежа другой тип?

    @immelnikoff
    Изучаю БД
    Вот эта строка
    str(blink[1][1])
    ничего не делает. Функция str() возвращает строку (не меняет значение на месте), но вы с возвращенным значением ничего не делаете.
    blink=(['fire', 'wood'], [1, 3, 777])
    nums = [5,6,10]
    blink[0].extend(['water', 'stone'])
    blink[1].extend(nums)
    print(blink)
    blink[1][1] = str(blink[1][1]) # присваиваем элементу blink[1][1] строку
    print(blink)
    Ответ написан
    1 комментарий
  • Как запросить число через cin в C++ чтобы оно заканчивалось на цифру 5?

    @Mercury13
    Программист на «си с крестами» и не только
    Это невозможно, мэн волен ввести в консоль что угодно.
    Но ваша задача как программиста — каким-то образом не допустить некорректного ввода. То ли вывести ошибку, то ли самостийно округлить, то ли потребовать повторный ввод… Вы уж сами думайте, что требуется именно от вашей программы.
    Условие «кончается на 5» эквивалентно  «не делится на 10, но делится на 5».
    Ответ написан
  • Как правильно обеспечить сохранность базы данных?

    DmitriyEntelis
    @DmitriyEntelis
    Думаю за деньги
    Говорить о какой то надежности можно имея минимум 2 (а лучше больше) физических сервера.
    Дальше настраиваем master-slave репликацию, если есть платежные данные - то в максимально параноидальном синхронном режиме.
    Запрос не будет закончен пока данные не сохранятся на 2й сервер.

    upd
    2 клевых доклада (пусть и не совсем по этой теме):
    www.slideshare.net/profyclub_ru/mailru-group-41346...
    www.slideshare.net/profyclub_ru/my-sql-sphinx?qid=...
    Ответ написан
    7 комментариев
  • Не могу понять, где ошибка в коде?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Вам сюда.
    Ответ написан
    Комментировать
  • Как правильнее переопределить метод родительского класса?

    @HaveFun
    Если есть необязательные параметры или претенденты на это звание, то размещать их нужно справа. Тогда можно использовать такой вариант:

    abstract class GlobalClass {
        ...
        protected function isExists($value, $field) {
            return $this->db->isExists($this->table_name, $field, $value);
        }
    }
    ...
    class User extends GlobalClass {
        ...
        public function isExists($value, $field=null) {
            $field = 'login';
            return parent::isExists($value, $field);
        }
    }


    Менять порядок обязательных параметров слева не стоит. Если он у родителя первый, то и у потомка должен быть первым.

    И судя по
    public function isExists($login) {
    		return $this->isExists("login", $login);
    	}
    следующей ошибкой будет Maximum function nesting level. Используйте parent.
    Ответ написан
    Комментировать
  • Как правильнее переопределить метод родительского класса?

    @vdem
    В двух словах: объявление метода isExists() должно совпадать с объявлением этого метода в классе-предке, что вам и ответил интерпретатор. У вас оно не совпадает по параметрам.
    Ответ написан
    Комментировать
  • Как можно организовать условие, если юзер авторизован на сайте?

    @andreyqin
    При авторизации записываете в сессию какой флаг, например:
    $_SESSION['user'] = 1;
    А на главной странице проверяете:
    if (isset($_SESSION['user']) && $_SESSION['user'] == 1) {
        echo 'Вы авторизованы';
    } else {
        /* Показываете ваши кнопки "Вход" и "Регистрация" */
    }
    Ответ написан
    Комментировать
  • Как можно выдать пользователю модальное окно после успешной регистрации?

    mannaro
    @mannaro Куратор тега JavaScript
    Умею профессионально гуглить
    делайте переадресацию с GET параметром.

    Т.е. зашел пользователь на страницу /index.php зарегистрировался. Его перекинуло на /index.php?register=1
    А там такой код:

    if ($_GET['register']) {
      include('./popup-register-success.php');
    }
    Ответ написан
    Комментировать
  • PHP сессии и авторизация

    mannaro
    @mannaro
    Умею профессионально гуглить
    Да, это безопасно, так как

    Сессия это хеш который хранится в куках у пользователя, при обращение пользователя к скрипту, пхп сверяет хеш и берет из файла данные этой сессии.


    Но, советую проверять IP пользователя, дабы хоть немного защититься от подмены сессий.
    И да, session_regenerate_id(); совсем не нужно.

    session_start();
    $ip = $_SESSION['userIP'];
    
    if (!$ip) {
        $_SESSION['userIP'] = $_SERVER['REMOTE_ADDR'];
    } elseif ($ip != $_SERVER['REMOTE_ADDR']) {
        session_destroy();
        session_start();
    }
    Ответ написан
    Комментировать