Задать вопрос
  • Оценка своего уровня. Как улучшить код?

    rockon404
    @rockon404 Куратор тега React
    Frontend Developer
    1. Используйте const вместо let для определения переменных которые не переопределяются в коде. Это помогает снизить когнитивную нагрузку с человека читающего код и негласный стандарт в React разработке.

    2. Такие вещи как globalStyles и конфигурацию store лучше вынести в отдельные файлы. Они могут со временем хорошо разрастись.
    По поводу globalStyles, вы вообще можете вынести их в отдельный css файл.

    3. Вместо:
    {
      isModal
      ? <Route path="/auth" component={AuthPopup} />
      : null
    }

    лучше:
    {isModal && <Route path="/auth" component={AuthPopup} />}


    4. Вместо:
    function mapDispatchToProps(dispatch) {
        return {
            autoLogin: () => dispatch(autoLogin()),
            getBrowser: () => dispatch(getBrowser()),
            getMedia: () => dispatch(getMedia())
        }
    }


    лучше:
    const mapDispatchToProps = {
      autoLogin,
      getBrowser,
      getMedia,
    };


    5. Точки с запятыми в конце то есть, то нет. Определитесь и приведите код к одному виду.

    6.
    & label {}
    & input {}
    & span {}

    Это не очень хороший подход. Во-первых ваши стили не изолированные, что может приводить к неожиданным результатам. Во-вторых у вас очень много дублирования стилей. Определите Input и Label как базовые компоненты и используйте в разных местах, то же с остальным если есть.

    7. Почему папка со страницами называется Containers? Дань бойлерплейтам?

    8. Использование trailing comma является хорошей практикой.

    9.
    import {combineReducers} from 'redux';
    import photoReducer from './photoReducer';
    import authReducer from './authReducer';
    import globalReducer from './globalReducer';
    
    export default combineReducers({
        photoReducer, authReducer, globalReducer
    })


    Все таки приятней работать с хранилищем в котором ключи не имеют в названии слова reducer:
    import {combineReducers} from 'redux';
    import photo from './photoReducer';
    import auth from './authReducer';
    import global from './globalReducer';
    
    export default combineReducers({
      photo, 
      auth,
      global,
    });


    10. Забудьте вообще, что в языке есть возможность использовать вложенный тернарный оператор:
    return e === 'invalid-email' ? 'Неверно указан e-mail'
        : e === 'user-not-found' ? 'Указанный e-mail на найден'
        : e === 'wrong-password' ? 'Неверный пароль'
        : e === 'email-already-in-use' ? 'Указанный e-mail уже используется'
        : e === 'network-request-failed' ? 'Нет подключения к интернету'
        : e === 'operation-not-allowed' ? 'Произошла ошибка, попробуйте снова'
        : e === 'popup-closed-by-user' ? 'Окно авторизации закрыто пользователем'
        : e === 'account-exists-with-different-credential' ? 'Аккаунт уже существует с другими данными, используйте другой способ авторизации'
        : e

    Это одна из самых худших практик в JavaScript разработке. Тут лучше подойдет конструкция switch case

    11. Константы actionTypes лучше вынести в папку constants и разложить по разным файлам, иначе со временем у вас там будет свалка.

    12. Вместо:
    import {SET_ACTIVE, CHANGE_VALUE, SET_DEFAULT, UPLOAD, UPDATE_IMAGE, SET_IMAGE_ERROR, SET_LIKE, SET_COMMENT, ADD_ARTICLE_SUCCESS, FETCH_ARTICLES_START, FETCH_ARTICLES_SUCCESS, FETCH_ARTICLES_ERROR} from '../actions/actionTypes';

    Лучше:
    import {
      SET_ACTIVE,
      CHANGE_VALUE,
      SET_DEFAULT, UPLOAD,  
      UPDATE_IMAGE,
      SET_IMAGE_ERROR,
      SET_LIKE,
      SET_COMMENT,
      ADD_ARTICLE_SUCCESS,
      FETCH_ARTICLES_START,
      FETCH_ARTICLES_SUCCESS,
      FETCH_ARTICLES_ERROR,
    } from '../actions/actionTypes';


    13. Попробуйте внедрить библиотеку reselect. И для получения значения из store вместо записи вида:
    function mapStateToProps(state) {
        return {
            browser: state.globalReducer.browser
        }
    }


    использовать селектор:
    const mapStateToProps = state => ({
      browser: browserSelector(state),
    });
    Ответ написан
    12 комментариев
  • Запись в массив?

    @Mysterion
    Да. И не надо слушать всяких edward_freedom.
    Ответ написан
    6 комментариев
  • Зачем нужен указатель на void?

    @Mercury13
    Программист на «си с крестами» и не только
    void* используется как указатель на сырые байтовые данные, не имеющие конкретного типа.
    Обычно это используется…
    1. В чтении-записи в файлы и на устройства, когда мы можем писать туда абсолютно любые типы.
    2. В «многоликих» функциях, которые могут принимать данные разных типов (malloc/calloc, часть функций WinAPI и ODBC).
    3. Как дескриптор — указатель, который запрещается разыменовывать. В Си для этого также часто используют указатель на недоопределённый тип, в Паскале с другими правилами эквивалентности типов — на пустой record. Но только пока не появится очередная многоликая функция вроде CloseHandle.
    4. Для обеспечения т.н. замыкания — передачи callback’у контекста, откуда была вызвана функция, вызвавшая callback.
    BOOL WINAPI EnumWindows(
      _In_ WNDENUMPROC lpEnumFunc,
      _In_ LPARAM      lParam
    );
    
    BOOL CALLBACK EnumWindowsProc(
      _In_ HWND   hwnd,
      _In_ LPARAM lParam
    );

    Вот этот LPARAM, который обычно определяется как какой-то указатель, и есть замыкание. Функция EnumWindows обещает передать его в функцию lpEnumFunc без изменений.
    (В Си++ для этого также используют виртуальные интерфейсы, но такой метод, сами понимаете, языкозависим и не годится для межъязыкового API.)

    Что происходит на стороне функции? Одно из двух (считаем, функция написана на ЯВУ).
    1. Либо вызывается некая функция устройства, которая говорит: «записать 100 байт», и дальше уже работает железо.
    2. Либо мы преобразуем void* в нужный нам тип и работаем с ним.

    Типы указателям дают по трём причинам.
    1. Вы забыли про операцию «разыменовать указатель». Чтобы его разыменовать, он должен иметь тип!
    2. Чтобы не ошибаться и не переприсвоить несовместимые указатели.
    3. Для полиморфизма — в Си++, давая delete x, мы даже можем не хранить, сколько байтов в блоке, поскольку мы знаем длину типа. (Есть ещё и виртуальные классы, но это другой вопрос.)
    Ответ написан
    Комментировать
  • Перегрузка [] на запись В C++?

    devalone
    @devalone
    ̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻
    #include <iostream>
    
    template <typename T, size_t N>
    class TestArray {
    public:
    	T& operator[](size_t i) {
    		return data[i];
    	}
    private:
    	T data[N];
    };
    
    int main() {
    	TestArray<int, 10> arr;
    	arr[0] = 99;
    	arr[1] = -1;
    	std::cout << arr[0] << std::endl;
    	std::cout << arr[1] << std::endl;
    	return 0;
    }
    Ответ написан
    Комментировать
  • Подойдёт ли Macbook Air 13 2017?

    @evgen9586
    Backend-dev. Лублу Enterprise и не люблю понты)
    Если много лишних денег, вам важны понты и внимание от окружающих то пойдёт.

    Имхо Есть ультрабуки Xiaomi гораздо дешевле. Накатываете Винду+ Линуху, можно и Хакинтош с кловером и радуетесь жизни. А дистрибов линухи куча под любой вкус. Да и говорят уже что писать там лучше чем под Маком. Но если уже такая страсть к мак оси - хакинтош.
    Ответ написан
  • C#(Unity) - Почему не увеличивается int?

    Kubatai
    @Kubatai
    Техник-программист
    1. Если это копия рабочего кода, то обратите внимание, что переменная объявлена как Triger, а увеличивается переменная Trigger. Возможно у вас несколько переменных с похожими названиями и вы просто увеличиваете не ту.
    2. Если переменная используется несколькими потоками, то используйте interlocked increment.

    Пройдитесь пошагово дебаггером по коду или используйте UnityEngine.Debug.Log в методе GetDamage() рядом с Trigger++ для того что бы в реальном времени видеть что происходит в вашем коде. Возможно какое-либо из условий просто не выполняется.

    P.S. случаев с неработающим инкрементом в сети нет(за исключение i = i++), советую вам все-таки поискать источник, который обнуляет вашу переменную, или заменить код на i += 1 ;)
    Ответ написан
    3 комментария
  • Как сделать подобный вариант карусели?

    lazalu68
    @lazalu68
    Salmon
    Не очень понятно какой функционал вам нужен и тем более что вы подразумеваете под правильным вариантом. Ну, вы можете например инициализировать слайдер с одним слайдом, указать количество видимых слайдов (items: N) и попросить чтобы слайдер был цикличный (loop: true), тогда owl carousel сам размножит ваш слайд, а вам останется только развесить нужные классы или вообще стилизовать слайды с помощью :nth-child
    Ответ написан
    Комментировать
  • Как заинтересовать человека(студента) в IT?

    sim3x
    @sim3x
    Не надо нам тут лишних людей
    Ответ написан
    Комментировать
  • Как правильно подключать классы с помощью use? Куда composer устанавливает пакеты в Laravel?

    wielski
    @wielski
    ✔ Совет: Вам помогли? Отметьте ответы решением.
    1) Все пакеты для Laravel устанавливаются компосером в папку /vendor/
    2) У классов может быть любое пространство имен, но обычно это Производитель\Пакет\Класс
    3) Обычно в инструкции к пакетам указывают как все устанавливать и верно подключать, но в вашем случае логичнее будет разместить следующий код в самом верху контроллера, в котором собираетесь использовать API:
    use getjump\Vk\Core as VK;
    use getjump\Vk\Auth as VKAuth;
    use getjump\Vk\Wrapper\Friends as VKFriends;
    // и т.д.


    И использовать вместо getjump\Vk\Core:: конструкцию VK::
    Ответ написан
    Комментировать
  • 301 moved permanently при попытке авторизоваться в Qiwi c помощью Curl. Как исправить?

    @shad541
    Есть решение!
    require_once 'Curl.php'; //https://github.com/php-curl-class/php-curl-class
    
    $curl = new \Curl\Curl();
    $curl->setOpt(CURLOPT_SSL_VERIFYPEER, 0);
    $curl->setCookieFile('cookie.txt');
    $curl->setHeader('Content-Type', 'application/json');
    $curl->setHeader('X-Requested-With', 'XMLHttpRequest');
    $curl->setUserAgent('Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:40.0) Gecko/20100101 Firefox/40.0');
    
    // Получаем TGT-тикет по логину и паролю
    $res = json_decode($curl->post('https://auth.qiwi.com/cas/tgts', json_encode(array(
        'login' => '+***',
        'password' => '***'
    ))));
    $TgtTicket = $res->entity->ticket;
    
    // Получаем пару ST-тикетов по TGT-тикету
    // первый тикет не нужен, а вот второй понадобится
    $curl->post('https://auth.qiwi.com/cas/sts', json_encode(array(
        'ticket' => $TgtTicket,
        'service' => 'https://qiwi.com/j_spring_cas_security_check',
    )));
    
    $res = json_decode($curl->post('https://auth.qiwi.com/cas/sts', json_encode(array(
        'ticket' => $TgtTicket,
        'service' => 'https://qiwi.com/j_spring_cas_security_check',
    ))));
    $STticket = $res->entity->ticket;
    
    // выполняем чек
    $res = $curl->get('https://qiwi.com/j_spring_cas_security_check?ticket='.$STticket);
    // запрос к проксе
    $res = $curl->get('https://auth.qiwi.com/app/proxy?v=1');
    
    // запрос отчета за неделю
    $curl->setHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
    $reports = $curl->post('https://qiwi.com/user/report/list.action', array(
        'type' => '3'
    ));
    // возвращаем Content-Type назад
    $curl->setHeader('Content-Type', 'application/json');
    
    print_r($reports);  // обработка результатов
    
    // запрос баланса etc
    $res = $curl->post('https://qiwi.com/person/state.action');
    print_r($res); // обработка результатов
    
    $curl->close();
    Ответ написан
    1 комментарий
  • Как работать c QList в QML?

    Zifix
    @Zifix Куратор тега Qt
    Barbatum
    Возможность есть. Встречный вопрос, есть ли у вас возможность пользоваться поисковыми системами?
    Ответ написан
    Комментировать