All streams
Search
Write a publication
Pull to refresh
44
0
Dmitry @RPG18

Golang Developer

Send message

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

Для этого нужно убедить менеджеров, тим лидов и т.д. в том, что все эти штуки действительно нужны компании.

Мне запретили такой код выкладывать.

Он вскользь упоминает о необходимости другого вида тестирования. Модульное тестирование обеспечивает в эффективность в среднем 30%. Что-то в этом отношении поменялось, после того как Макконнел опубликовал эти цифры?


Так же он недостаточно говорил о рефакторинге кода. В XP рефакторинг включается в итерацию. В TDD тоже используется рефакторинг. Рефакторинг кода во время разработки, это выплата процентов по техническому долгу. Все об этом знают, но как выразился asolntsev:


Это как спорт: все знают, что спорт полезен, но ленятся.

Почитай комментарии, все свелось к обсуждению "писать тесты до" или "писать тесты после".

Я бы советовал бы прочитать/перечитать следующую литературу:
Кент Бек "Экстремальное программирование".
На вопрос почему XP дает хорошие результаты отвечает Стив Макконнел в "Совершенный код".
Если вы считаете, что умеете писать тесты, то Кори Сандлер, Том Баджетт, Гленфорд Майерс "Искусство тестирования программ".

К тому же я бы посмотрел на создание сайта на C++.

Пожалуйста Диалог выбора файлов на Wt.


А я бы посмотрел бы на создание сайта на Python/Ruby/PHP без фреймворокв/CMS и фреймворков/библиотек JavaScript и без надстроек над CSS. К чему это? Со времен выхода "Мифического человека-месяца" самый дешевый и быстрый способ разработки: купить готовое, а не писать своё. Сейчас для быстрой скорости разработки во главе угла стоят фреймворки, библиотеки и другие готовые компоненты, а сам язык уходит на второй план.

Нет, но можно создать свойство с var и при изменение значения, значение в контролах поменяются.

Преждевременная оптимизация — корень всех зол.

Д. Кнут.


Часть типов в Qt implicitly shared, а значит копирование приводит к увеличению атомарных счетчиков, а не выделение и перемещение(std::memmove) памяти. А если уж хочется минимезировать инкриментирование атомарных счетчиков, то можно pimpl применить:


pimpl
class Film
{
    Q_GADGET

    Q_PROPERTY(quint64 id READ id)
    Q_PROPERTY(QString endName  READ engName CONSTANT FINAL)
    Q_PROPERTY(QString rusName  READ rusName CONSTANT FINAL)
    Q_PROPERTY(QUrl coverUrl READ coverUrl CONSTANT FINAL)
    Q_PROPERTY(QUrl coverMaxiURL READ coverMaxiURL CONSTANT FINAL)
    Q_PROPERTY(QStringList screenshotsURL READ screenshotsURL CONSTANT FINAL)
    Q_PROPERTY(QString duration READ duration CONSTANT FINAL)
    Q_PROPERTY(QString description READ description CONSTANT FINAL)
    Q_PROPERTY(quint32 year READ year CONSTANT FINAL)
    Q_PROPERTY(QString countries READ countries CONSTANT FINAL)
    Q_PROPERTY(QString actors READ actors CONSTANT FINAL)
    Q_PROPERTY(QString genres READ genres CONSTANT FINAL)
    Q_PROPERTY(bool isValid READ isValid CONSTANT FINAL)

public:

    typedef QList<QUrl> Urls;

    Film();
    Film(Film&& obj);
    Film(const Film& obj) = default;

    static Film formJson(const QJsonObject& obj);

    quint64  id() const noexcept ;
    const QString& engName() const noexcept;
    const QString& rusName() const noexcept;

    const QUrl& coverUrl() const noexcept;
    const QUrl& coverMaxiURL() const noexcept;

    const QStringList& screenshotsURL() const noexcept;
    const QString& duration() const noexcept;

    const QString& description() const noexcept;

    quint32 year() const noexcept;

    const QString& countries() const noexcept;
    const QString& actors() const noexcept;
    const QString& genres() const noexcept;

    bool isValid() const noexcept;
    bool operator==(const Film& film) const noexcept;

private:

    struct FilmImpl;
    std::shared_ptr<FilmImpl> m_impl;
};

#include <QtCore/QDebug>
#include <QtCore/QVariant>
#include <QtCore/QJsonArray>
#include <QtCore/QJsonObject>

#include "Film.h"

struct Film::FilmImpl
{
    bool m_isValid = false;
    quint64 m_id   = 0;

    QString m_engName;
    QString m_russName;
    QUrl m_coverURL;
    QUrl m_coverMaxiURL;
    QStringList m_screenshotsURL;
    QString m_duration;
    QString m_description;
    QString countries;
    QString actors;
    QString genres;
    quint32 year;
};

Film::Film()
    : m_impl(std::make_shared<FilmImpl>())
{

}

Film::Film(Film&& obj):
    m_impl(std::move(obj.m_impl))
{
}

quint64 Film::id() const noexcept
{
    return m_impl->m_id;
}

const QStringList& Film::screenshotsURL() const noexcept
{
    return m_impl->m_screenshotsURL;
}

const QString& Film::rusName() const noexcept
{
    return m_impl->m_russName;
}

const QString& Film::engName() const noexcept
{
    return m_impl->m_engName;
}

const QUrl& Film::coverUrl() const noexcept
{
    return m_impl->m_coverURL;
}

const QUrl& Film::coverMaxiURL() const noexcept
{
    return m_impl->m_coverMaxiURL;
}
bool Film::isValid() const noexcept
{
    return m_impl->m_isValid;
}

const QString& Film::duration() const noexcept
{
    return m_impl->m_duration;
}

const QString& Film::description() const noexcept
{
    return m_impl->m_description;
}

bool Film::operator==(const Film& film) const noexcept
{
    return m_impl->m_id == film.m_impl->m_id;
}

Film Film::formJson(const QJsonObject &obj)
{
    Film film;
    film.m_impl->m_isValid      = true;
    film.m_impl->m_id           = obj.value("id").toVariant().toULongLong();
    film.m_impl->m_russName     = obj.value("rusName").toString();
    film.m_impl->m_engName      = obj.value("engName").toString();
    film.m_impl->m_description  = obj.value("description").toString();
    film.m_impl->countries      = obj.value("countries").toString();

    film.m_impl->m_coverURL     = QUrl(obj.value("coverURL").toString());
    film.m_impl->m_coverMaxiURL = QUrl(obj.value("coverMaxiURL").toString());
    film.m_impl->m_duration     = obj.value("duration").toString();

    film.m_impl->year           = obj.value("releaseYear").toVariant().toUInt();
    film.m_impl->actors         = obj.value("actors").toString();
    film.m_impl->genres         = obj.value("genres").toString();

    for(const auto& val : obj.value("screenshotsURL").toArray())
    {
        film.m_impl->m_screenshotsURL.push_back(val.toString());
    }

    return film;
}
quint32 Film::year() const noexcept
{
    return m_impl->year;
}
const QString& Film::countries() const noexcept
{
    return m_impl->countries;
}

const QString& Film::actors() const noexcept
{
    return m_impl->actors;
}

const QString& Film::genres() const noexcept
{
    return m_impl->genres;
}

Есть QML профайлер, всегда можно посмотреть что подтормаживает.

Например если делать клиент для сервиса(на скриншоте клиент futuron.tv), то сервер использует пагинацию, что уменьшает число элементов, то вопрос производительности особо не стоит. А вот когда количество полей у структуры очень много:


{
      "id" : 1708722,
      "type" : 0,
      "rate" : 3,
      "creationTime" : 1460376607027,
      "downloads" : 0,
      "rusName" : "Пришельцы 3: Взятие Бастилии",
      "engName" : "Les Visiteurs: La Révolution",
      "releaseYear" : 2016,
      "description" : "В третьей части граф с оруженосцем отправляются в самое сложное для Франции время — период Французской революции.",
      "youtubeId" : "FmpaphvPiTY",
      "imdbRate" : "4.4",
      "kpRate" : "5.8",
      "duration" : "1ч.50мин.",
      "officialSite" : "http://lesvisiteurs-lefilm.com/,http://vk.com/lesvisiteurs",
      "video3d" : false,
      "nextSeazonId" : 0,
      "rusAgeRate" : "12+",
      "studies" : "Ciné, TF1 Films Production, Canal+ [fr], Nexus Factory, Gaumont, Gaumont, The Czech Republic State Fund for Support and Development of Cinematography, La Wallonie, Okko Productions, Ouille Productions, BNP Paribas Fortis Film Finance",
      "directors" : "Жан-Мари Пуаре",
      "actors" : "Сильви Тестю, Кристиан Клавье, Жан Рено, Эри Абиттан, Карин Вьяр, Лоран Дойч, Франк Дюбоск, Фредерик Бель, Мари-Анн Шазель, Алекс Лутс, Вероника Буланжер, Стефани де Крэенкур",
      "countries" : "Франция",
      "genres" : "Комедии",
      "translationTypes" : "Проф. многоголосый",
      "translationAuthors" : "",
      "videoQuality" : "HD",
      "audioQuality" : "чистый звук",
      "languages" : "",
      "coverURL" : "http://static-gw.futuron.name/static/mobile/71/CF/71CF47394B5BA22ADDA68C66F29019E5.jpeg",
      "coverMaxiURL" : "http://static-gw.futuron.name/static/mobile/71/CF/71CF47394B5BA22ADDA68C66F29019E5.jpeg",
      "posterURL" : "http://static-gw.futuron.name/static/torrents/DA/69/DA69912E9EE01738090984132A70DEBA.jpg",
      "screenshotsURL" : [ "http://static-gw.futuron.name/static/torrents/32/5A/325A0ADEABE689251170180309FFF167.jpg", "http://static-gw.futuron.name/static/torrents/2D/2E/2D2E3DC8B83DA2FF7764BB6AE4E50398.jpg", "http://static-gw.futuron.name/static/torrents/D7/71/D771B2DA86EDE8EC444D80E7E2D6BA1B.jpg", "http://static-gw.futuron.name/static/torrents/F0/E6/F0E6AB1DCA3366E0E1C3BE3C5A09E11B.jpg", "http://static-gw.futuron.name/static/torrents/6F/C0/6FC0895E1E265C0D3DBF4671FD330595.jpg", "http://static-gw.futuron.name/static/torrents/D3/05/D3059FCE4D46B868ADB88FD4FC1C0241.jpg" ]
    }

то создавать роли может быть неудобно. Тут как всегда, нужно смотреть по ситуации.

Отлично! Теперь буду знать.

Легко на x86, x86-64, arm5/7 размер int в gcc 4 байта.

Я бы сказал бы, что Erlang разрабатывался инженерами для решения своих задач. На эту тему очень интересна дискуссия: Joe Armstrong and Simon Peyton Jones discuss Erlang and Haskell

А толку от диктофона? Вот и остается только менять работу.

На тех кто остался — «ну спасибо, Вася, теперь твой громадный модуль нам досталось вести!».

Bus factor? Если да, то руководство виновато, что ничего не делало.

А чем ты думал, когда брался за него?
А есть выбор? На собеседовании говорят об одном, а потом дают совсем другое.

Только есть четкое определение социальной группы, и курильщики к ней не относятся.

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

Проекту не первый год, и был опыт Mer, MeeGo, Maemo. О каком R&D сейчас идет речь?

Я говорю о том, что вместо производства дорогих моделей, компания производитель может начать с выпуска аппаратов в ценовой категории 50$.

Information

Rating
Does not participate
Location
Санкт-Петербург, Санкт-Петербург и область, Россия
Date of birth
Registered
Activity