• Является ли хорошим решением разбивать большой класс на несколько .cpp файлов (C++)?

    @MarkusD Куратор тега C++
    все время мелю чепуху :)
    Если дать короткий ответ, то всегда следует задуматься о декомпозиции класса в такой ситуации.

    Подобный твоему класс представляет из себя монолит - довольно распространенный примитив проектирования, попутно именуемый как "God Object". Объект, который может всё и от которого все вокруг зависят.
    Если появляется желание разбить реализацию интерфейса класса на несколько файлов, значит уже есть понимание того, как тематически декомпозировать этот класс и, вероятно, проблема остается только в том, чтобы правильно декомпозировать состояние класса.

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

    Если говорить развернуто.

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

    В таких случаях люди и приходят к тому, чтобы провести тематическое разделение интерфейса класса и его реализаций. Интерфейс класса делится на тематические секции внутри своих областей доступа. В это же время, каждой тематической секции интерфейса соответствует свой файл исходного кода класса.

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

    Общий шаблон такого разделения выглядит так. Чаще всего разработчики именуют файлы именем класса. Например MyClass.h и MyClass.cpp. Когда нужно тематически разделить определение интерфейса, к имени класса после точки и перед расширением файла добавляется суффикс, говорящий о тематике определения. Например MyClass.serialization.cpp, MyClass.crud.cpp или MyClass.callbacks.cpp.
    Ответ написан
    5 комментариев
  • Является ли хорошим решением разбивать большой класс на несколько .cpp файлов (C++)?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Это очень плохая идея. Теперь пользователю придется искать функцию в 5 файлах, потому что она может быть в любом из них. Если же куски класса можно как-то логически сгруппировать, то надо разбить сам класс на несколько более мелких. Вынести часть функционала в вспомогательные классы или даже тупо функции.

    Большой файл - гораздо менее вредно, чем нелогичная файловая структура проекта. Вот большие функции и класс с излишне большой ответственностью - это плохо. А файл - фигня. Строк от разбивки меньше не становится. Ну придется еще переключатся между файлами - только хуже станет.
    Ответ написан
    Комментировать
  • Является ли хорошим решением разбивать большой класс на несколько .cpp файлов (C++)?

    Adamos
    @Adamos
    До появления IDE это могло считаться решением.
    Сейчас - никому не нужный и даже мешающий костыль.

    Собственно, класс на тысячи строк - сам по себе не проблема.
    А вот то, что его хочется раскидать по пяти файлам - явный намек на то, что для упрощения кода требуется рефакторинг.
    Ответ написан
    3 комментария
  • Насколько совместимы китайские клавиатуры с Linux?

    DevMan
    @DevMan
    да кагбе любая клава работает в базе.
    вопросы могут быть только к дополнительным кнопкам.
    Ответ написан
    1 комментарий
  • Применим ли термин роллинг-релиз для пакетов?

    vabka
    @vabka
    Токсичный шарпист
    Rolling release - это про подход, а не про свежесть какой-то конкретной версии.
    Так что нет, такое использование термина некорректно
    Ответ написан
    Комментировать
  • Как сделать удобный ввод пути до файла в своем Bash скрипте?

    sotvm
    @sotvm
    Умный поймёт, а дураку и так всё равно.
    добавить свой путь в PATH
    зы пропиши в башрс пару строк
    ифы лишеие выкини, я просто скопировал кусок целиком
    # enable programmable completion features (you don't need to enable
    # this, if it's already enabled in /etc/bash.bashrc and /etc/profile
    # sources /etc/bash.bashrc).
    if ! shopt -oq posix; then
      if [ -f /usr/share/bash-completion/bash_completion ]; 
    	then . /usr/share/bash-completion/bash_completion
      elif [ -f /etc/bash_completion ];
    	then . /etc/bash_completion
      fi
    fi
    
    if [ -x /usr/games/fortune ];
    then fortune ru |lolcat -F 0.7 ;
    fi
    
    ##  сперва будет искать man на русском, а если его нет, то на английском.
    export MANOPT="-L ru"
    
    ## По умолчанию, каждый экземпляр bash переписывает историю. То есть, если вы запустите два терминала, что-то в них сделаете, а потом закроете, то история сохранится только от последнего закрытого. (Она затрёт историю первого закрытого.) Это очень неудобно и легко исправляется вот такой командой:
    shopt -s histappend
    
    ##[ -f ~/.fzf.bash ] && . ~/.fzf.bash
    
    
    if [ -s ~/.Xmodmap ];
    then xmodmap ~/.Xmodmap
    fi
    
    ## для Wine
    export MESA_GL_VERSION_OVERRIDE=4.5
    Ответ написан
    2 комментария
  • Как сделать удобный ввод пути до файла в своем Bash скрипте?

    martin74ua
    @martin74ua Куратор тега Linux
    Linux administrator
    Подстановкой по TAB занимается не ваш скрипт, это делает bash. А если быть совсем точным - bash-completion. В нем описаны для разных программ допустимые аргументы и варианты подстановок. Вам стоит разобраться в правилах написания bash-completion расширения под ваш скрипт и распространять скрипт вместе с этим расширением.
    Ответ написан
    Комментировать
  • Как создать свою команду в Linux?

    NullByte
    @NullByte
    Bad gateway
    для этого создайте постоянный алиас:
    echo 'alias android="cd /opt/android-studio/bin/; ./studio.sh"' >> ~/.bashrc

    эта команда запишет в файл конфига bash ваш постоянный собственный алиас к необходимой команде (или нескольким через знак ";"). т.е. если будете вбивать "android" от имени своего юзера, то автоматом в данном случае будет осуществлен переход в нужную директорию и запускаться Андроид Студио. я думаю это самый простой способ :)
    Ответ написан
    Комментировать
  • Как добавить Linux Ubuntu в Windows Boot Manager?

    TalismanChet
    @TalismanChet
    Лицо зла
    Легче Grub4DOS или просто Grub поставить и настроить загрузку для сколь угодно любых операционок
    Ответ написан
    Комментировать
  • Как добавить Linux Ubuntu в Windows Boot Manager?

    @Drno
    Загрузчик не должен быть красивым. Он должен быть 200% надежным. Это все что от него требуется.
    Ответ написан
    3 комментария
  • Как получить путь до рабочего стола пользователя Ubuntu?

    sotvm
    @sotvm
    Умный поймёт, а дураку и так всё равно.
    sudo find /  -maxdepth 3 -type d -name "Desktop" -o  -name "Рабочий стол"
    Ответ написан
    4 комментария
  • Как получить путь до рабочего стола пользователя Ubuntu?

    @xibir
    Попробуйте так:

    #!/bin/bash
    for user in /home/*; do
       [ $user == /home/lost+found ] && continue
    
       d="$user/Desktop"
       if [ ! -d "$d" ]; then
          d="$user/Рабочий стол"
          [ -d "$d" ] || continue
       fi
    
       install -m777 sources/{update,shutdown}.desktop "$d"
    done
    Ответ написан
    4 комментария
  • Как заменить SSD M.2 на SSD 2.5 если нет нужного SATA разьема?

    sf-002
    @sf-002
    Учу JS
    Это будет очень экзотический переходник, если такие делают - я бы поискал по модели ноутбука плату, которая шлейфом подключается, чтобы она с нужным разъемом была вместо M.2.
    Если без вариантов, можно вывести провод переходника SATA to USB наружу и подключиться к USB 3.0.

    UPD. В общем, есть такие переходники Orient C292S https://www.dns-shop.ru/product/fa4c9ef41a863330/v... плюс шлейф, но нужно откуда-то тянуть еще питание. Возможно на плате есть mini molex, но очень мало вероятно.
    Есть такой вариант Адаптер-преобразователь NGFF M.2 на USB 3,0 https://market.yandex.ru/product--adapter-preobraz... плюс Адаптер-переходник USB 3.0 - SATA lll для HDD/SSD https://market.yandex.ru/product--adapter-perekhod..., но тоже непонятно с питанием: у M.2, пишут, 3,5 вольта, а нужно - 5, и преобразователя там не видно. Но главное, смотрю на твои фото и понимаю, что нифига это туда все не поместиться, только корпус дырявить, как я и говорил ранее. Ну или просто держать SSD снаружи.
    Ответ написан
    Комментировать
  • Как заменить SSD M.2 на SSD 2.5 если нет нужного SATA разьема?

    karabanov
    @karabanov
    Системный администратор
    На M2 SSD написано, что он SATA. Надо купить переходник c разъёмом SATA, и подключить его вместо вот этого переходника для M2
    Ответ написан
    2 комментария
  • Какой ос пользоваться для написания на java?

    gadfi
    @gadfi
    https://gamega.org
    Какой ос пользоваться для написания на java?

    Оставайся на винде. Серьезно, был бы это Python то linux был бы оправдан, для ruby тоже лучше что то никсовое ) а вот для java по серьезной разницы нет. Все за тебя сделает maven, не трать время зря на изучение ос (хотя чтоб достаточно уютно себя чувствовать под той же ubuntu больше недели времени не займет), потрать его лучше на изучение java
    Ответ написан
    1 комментарий
  • Что написать на C++ для тренировки?

    @JavaBoy
    Студент
    Вот тут отличный список задач на совершенно разные области для закрепления и оттачивания навыков
    Ответ написан
    Комментировать
  • Java vs C++. Что полезнее?

    Для саморазвития? Учите все что нравится. Любые знаний это не только информация, но еще и идеи, мысли, концепции и др. ваших предшественников.

    Для работы? Какую работу хотите - такой стек технологий и выбирайте. Сравните вакансии и выберите тот набор, что вам по душе. Слишком много незнакомого? Попробуйте всего по немного и вы сами поймете к чему у вас душа лежит.

    Фриланс? Еще проще. Берите Java или C# для программ настольных компьютеров или приложений под Android и Windows Phone. Эти языки и технологии похожи. Если хотите веб, то тут немного по другому. Если цель - заработать денег - то начните с PHP и быстрее придете к конверсии ваших усилий в деньги. Если хотите саморазвитие + фриланс. Можете писать на PHP и не стеснятся этого, но параллельно учите еще один язык. Можно Python / Ruby или те же C++ / Java.

    Работа над какой-то задачей? Выберите тот язык, который больше подойдет.

    Преимущества, которые выделил я для C++:
    1. ООП вместе с преимуществами Си;
    2. Компиляторы под все платформы;
    3. Скорость.

    Преимущества, которые выделил я для Java:
    1. Кроссплатформенность;
    2. Удобство;
    3. Схожесть на C# (точнее наоборот, много пишу на C#);

    Из последнего. Под Windows написал программу под Mac не имея оного. Поправил пару строчек и все работает.
    Ответ написан
    2 комментария
  • Java vs C++. Что полезнее?

    bogolt
    @bogolt
    Удивляюсь почему в сравнении Java vs C++ многие упоминают, что Java кросс-плафторменна. Си++ тоже кросс-платформенный ЯП. Программа написанная на нем может быть скомпилирована практически под любой платформой. Да, программу на си++ нельзя перенести на уровне бинарников, но часто ли вы видели универсальные бинарники?
    Для Си++ есть множество очень полезных библиотек позволяющих писать красивый и быстрый GUI ( единственная известная мне хорошая GUI программа написанная на Джаве - Eclipse ). Большинство же десктопных приложений пишется именно на плюсах.
    В новом стандарте появилась нативная многопоточность ( впрочем раньше никто не мешал использовать одну из множества кросс-платформенных библиотек для достижения тех же целей ).

    Из основных недостатков си++ скажу что первые 2 года работы с этим языком программист больше вредит, нежели помогает. Это учитывая что он неплохо уже знает синтаксис и уже пишет на нем какие-то программы. Огромное количество скрытых ям, граблей, заряженный ружей - заботливо разложены создателями нескольких версий стандартов, в безумной мечте об обратной совместимости языка ( что конечно очень круто ).
    Ответ написан
    7 комментариев
  • Java vs C++. Что полезнее?

    @DancingOnWater
    Про Java не знаю, но я расскажу про C++ и C#, даром что последний сравнивают с Java.
    Макросы, нетипизированные шаблоны, частичная реализация этих самых шаблонов, указатели, константные ссылки, константные методы, перегрузка унарных операторов, разделение памяти на стек и кучу, - это только часть того, по чем я скучаю, программируя на C#.

    С помощью плюсов можно написать программу любой сложности и при этом всегда есть путь, на котором можно выбрать логичный стиль и придерживаться в ходе всей разработки, в C# увы этого нету.

    Также стоит заметить, что C++ не заканчивается на голом синтаксисе и STL, после того как вы познакомитесь с ними перед вами откроется целый мир различных библотек. От того обилия высококласных математических библиотек, что есть на C\C++ (а первый вы совершенно спокойно можете подлинковать к проекту и использовать без проблем) у меня слюны все клавиатуру заливают. А Qt с его сигналами и слотами.... И да, не верьте, что многопоточные приложения сложны плюсах, Qt и C++11 упрощают до предела.

    А когда баловство закончится и вы поймете, что вам надо решать задачи по-серьезнее, то перед вами откроется новый мир: вы начнете изучать компилятор и узнаете много нового о его ключах и возможностях оптимизаций. вы узнаете как можно ускорить свою прогу с помощью SSE, что такое OpenMP и OpenCL.

    Да, C++ строг и беспощаден, его изучение сравни с игрой в шахматы с превосходящим по силе соперником, где любая мелкая ошибка может оказаться фатальной. Но работая на C++ (работая, а не кодя так, чтоб отвязались) вы получите гораздо больше в понимании того, как устроены It-технологии, на чем зиждются и в чем их ограничения.
    Ответ написан
    1 комментарий
  • Java vs C++. Что полезнее?

    @ProkletyiPirat
    смотря что считать "распространенными задачами" ...

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

    так например на Java в сравнении с C++ проще и быстрее писать кросс платформенные приложения или много поточные приложения и при этом они будут работать быстрее C++, но зато когда дело касается железок или объёмной работы над памятью то на С++ писать быстрее и проще и работать будет быстрее чем Java.

    а весь цимес в том что не надо говорить "Java" или "C++", надо говорить "Java" и "C++", за счёт того что есть JNI вы спокойно можете вынести все нагруженные вычисления в С\С++, а в Java оставить всё остальное, и получить лучшее из двух миров.
    Ответ написан
    Комментировать