LINUX.ORG.RU

Вопрос по способу выполнения задачи (качество)

 , ,


0

1

Решаю, как лучше выполнять задачу.
Для удобства условия:

  • На чем пишем - С/C++.
  • Мы еще умеем на Python и Bash.

Скажем, нам нужно в программе разархивировать архив:

/archive.tar.gz
Это делается несложно:
root@linux:/# tar -xzvf /archive.tar.gz
Но мы должны это сделать из программы.
Тогда как лучше это делать:
1)
system("tar -xzvf /archive.tar.gz");
2) Сделать это с вызовом tar «красиво» - выкобениться с подключаемыми хедерами, вызвать методы из него и т. д.
Первый способ на вид неприятен, но он проще. Так в целях повышения качества кода что лучше?
PS: пишу на коленке.

★★★★★

Последнее исправление: DeadEye (всего исправлений: 1)

system в общем случае лучше чем второй.

а нельзя ли вообще работу с архивом на шелл-скрипте не?

qulinxao ★★☆
()
Ответ на: комментарий от qulinxao

Можно, просто программа сама по себе смесь С + Bash + Python, а из-за одного места я не хотел сильно перегружать программу скриптами.

DeadEye ★★★★★
() автор топика

Что-то ничего не понятно на счёт второго способа. Хочешь завернуть вызов system() в «библиотеку» или заюзать какой-нибудь libtar?

mashina ★★★★★
()
Ответ на: комментарий от DeadEye

Первый метод гарантированно сделает свою работу в отдельном процессе который унесёт с собой все потенциальные негативные сайдэффекты от своей деятельности.

Второй вариант может быть реализоват по-разному, и как обёртка для system() с tar, и как библиотека с ф-иями. В обоих случаях это скорее всего будет хуже чем system(), т.к. либо создаст лишнюю зависимость на пустом месте, либо потенциально будет накапливать баги в основном процессе.

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

mashina ★★★★★
()
Ответ на: комментарий от mashina

создаст лишнюю зависимость на пустом месте

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

anonymous
()
Ответ на: комментарий от mashina

То есть мне проще поступиться понятиями о красивости и писать system()? (Я не держусь за эти понятия, просто вопрос)

DeadEye ★★★★★
() автор топика
Ответ на: комментарий от DeadEye

То есть мне проще поступиться понятиями о красивости и писать system()?

Проще - да, либу искать не надо.

Лучше - хз. Под вендой с таром возится придётся например.

anonymous
()

Относительно качества кода лучше второй вариант. Есть явная зависимость от библиотеки tar (или что ты там будешь юзать).

Относительно произодительности — не спавнится лишний процесс, в отличие от вызова system.

devsdc ★★
()

первый способ юниксвейнее, tar присутствует почти везде и вообще вроде даже стандартом POSIX требуется

но лучше дополнительно проверять существование tar перед вызовом system и выдавать ошибку, если не найдено

также в некоторых системах (соляра) бинарник может называться gtar

Harald ★★★★★
()
Ответ на: комментарий от DeadEye

То есть мне проще поступиться понятиями о красивости и писать system()?

Какой-то странный вопрос, откуда постороним людям знать проще ли тебе поступиться с иррациональным чувством или нет. Я, например, так и непойму почему вдруг второй вариант «красивый», в топике совсем нет никаких намёков на возможные причины такого вывода. В инженерии «красивое» решение примерно которое решает задачу наиболее просто. Либа здесь выглядит как overengineering.

mashina ★★★★★
()
Ответ на: комментарий от anonymous

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

можешь на лбу у себя написать, что такому-то пакету нужен tar. Узнают все.

mashina ★★★★★
()
Ответ на: комментарий от mashina

можешь на лбу у себя написать, что такому-то пакету нужен tar. Узнают все.

Кроме компилятора, который при компиляции не выдаст ошибки. Фэйл.

anonymous
()
Ответ на: комментарий от Harald

Это типичный подход быдлокодера. «Да эта библиотека есть на любой системе!». Зависимости нужно указывать всегда, если это не вендоподелка, которая тащит всё нужное с собой. Чтобы его программа собралась и заработала или выдала хотя бы осмысленную ошибку на любом самом экзотичным дистрибутиве из прошлого и далёкого будушего.

KivApple ★★★★★
()
Последнее исправление: KivApple (всего исправлений: 1)

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

KivApple ★★★★★
()
Ответ на: комментарий от KivApple

Зависимости нужно указывать всегда

ну вот в соответствующем месте и указывай (ебилде, deb, rpm), там всем зависимостям место, а на винде да, нужно тащить tar с собой

Harald ★★★★★
()
Ответ на: комментарий от KivApple

или выдала хотя бы осмысленную ошибку

что мешает выдавать эту осмысленную ошибку в первом варианте? Проверяем наличие tar, выдаём ошибку

Harald ★★★★★
()
Ответ на: комментарий от DeadEye

дык использование system в коде для задачи управления файлами ( а лучше вообще какой нить внешний скрипт который(его исполнение) предшествует исполнению твоей числодробилки(которою главный скрипт и запускает)) и есть эталлоной крассивости решение в стиле юникса ,

посмотри на вике статью про автора sh Стивена Боурна и историю как шел постепенно стал полноценным языком программирования.

а вот стремление весь код опустить до С - это не здоровое и школовство.

qulinxao ★★☆
()

В питоне tarfile в стандартной либе идет.

anonymous
()
Ответ на: комментарий от qulinxao

Ну так он не будет его таскать. Он будет вызывать функцию из библиотеки из системного пакета. Он же не статически линкует.

KivApple ★★★★★
()
Ответ на: комментарий от Harald

а на винде да, нужно тащить tar с собой

Программа GNU/Linux-only. По определенным причинам.

DeadEye ★★★★★
() автор топика
Ответ на: комментарий от anonymous

Кроме компилятора, который при компиляции не выдаст ошибки. Фэйл.

Компилятор многое не узнает при компиляции. Например, не сможет оценить степень твоей упоротости.

mashina ★★★★★
()

Качественно сделать это одним из двух способов:

1) Хороший - использовать хедеры tar, прилинковать libtar, сделать обработчик эксепшенов, чеки на закоррапченый архив, права доступа в таргет директорию и т.д.

2) Приемлимый - так как твоя софтина всё равно сборная солянка из C++/Bash/Python, то какбэ она изначально несекурное и нестабильное нечто. Можно вынести вызов tar в bash-скрипт, который сам проверит всё на ошибки, сам распакует и сам напишет логи.

IvS
()

Я тут ради интереса посмотрел на своей гентушечке, оказывается libtar таки установлена, но использует её только vlc (интересно зачем?)

Harald ★★★★★
()
Ответ на: комментарий от Eddy_Em

а не лучше ли вообще организовать приложение так , что бы не нужно было бы из с-кода делать разпаковку(последством вызова ли или непосредственно библиотечной функцией)?

qulinxao ★★☆
()
Ответ на: комментарий от qulinxao

Не думаю: если ты, скажем, хранишь какие-нибудь xml/json и т.п. объекты, да еще дофига, лучше их сразу же и зиповать для сбережения места.

А если у тебя что-то вроде структуры опенофиса, то и tar понадобится.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от qulinxao

Без архива никак - там будут большие списки.

DeadEye ★★★★★
() автор топика

Ни то ни другое

первый вариант обещает сюрпризы со странными именами файлов, например «`rm -rf $HOME`.tar.gz». Второй не нужен. Правильно - вызывать внешнюю прогу, но без shell-ов(popenы/execи всякие).

DonkeyHot ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.