Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Общие вопросы по программированию, компьютерный форум
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.06.2013, 07:24   #31
MihalNik
МегаМодератор
СуперМодератор
 
Регистрация: 27.11.2012
Сообщений: 5,712
По умолчанию

Цитата:
Можно:
Код:
for (i=0; i<100; ++i) printf("привет"); // Сколько здесь строк кода?
Тут 2 логические строчки кода. Что не ясно?
Нельзя Здесь, очевидно, две совершенно не логичные строчки кода. Не ясно за каким вообще они могут понадобиться.
И Вы не дали эквивалентный пример для функционального кода. Поэтому сравнение невозможно.

Поясняю: если бы Вы писали код для другого человека и объясняли бы каждую строчку которую он не понял в (т.ч. из комментария) - Вы думали и мерили бы код по-другому. Пока Вы пишите один и для себя, не занимаетесь поддержкой, крупными правками - Вы можете думать как хочется.

Цитата:
Странный вопрос, комментируйте код как хотите и сколько хотите
Еще более странное понятие у Вас о размерах кода Комментировать "Как хотите" не получится, если, конечно, хоть как-то ценить свое время.
Благими намерениями устлана дорога на programmersforum.ru

Последний раз редактировалось MihalNik; 12.06.2013 в 07:31.
MihalNik вне форума Ответить с цитированием
Старый 12.06.2013, 07:48   #32
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,692
По умолчанию

Цитата:
Еще более странное понятие у Вас о размерах кода Комментировать "Как хотите" не получится, если, конечно, хоть как-то ценить свое время.
Тут вопрос точно также стоит в знании правил, правда меня им никто не научил и поэтому все вылилось в следующий самопал:

Код:
/**
 * @brief Абстрактный класс очереди процессов
 */

class CProcessQueue
{
private:
public:
    /**
     * @brief Конструктор абстрактного класса CProcessQueue
     */

    CProcessQueue( void ){ /**/ }

    /**
     * @brief Получить процесс из очереди, NULL если очередь пуста
     * @return Возвращает указатель на процесс
     * @code
     *if(process = queue.get())
     *  process.use(resource);
     * @endcode
     */

    virtual CProcess * get( void ) = 0;

    /**
     * @brief Добавить процесс в очередь
     * @param name Имя процесса
     * @param time Время жизни процесса
     * @param priority Приоритет процесса
     */

    virtual void addProcess(QString name = "", ushort time = 10, ushort priority = 1, ushort rtime = 4) = 0;

    /**
     * @brief snapshot
     * @return QVector<QQueue<CProcess> > Список всех очередей и процессов в них
     */

    virtual const QQueue<CProcess> & snapshot( void ) = 0;
};
Код:
class ModuleOption extends Attributes
{
	/**
	 * Конструктор класса <b>ModuleOption</b>
	 * @param array $attrs
	 * 
	 * Список параметров модуля. При передачи массива параметров допускается числа в качестве
	 * индекса, тогда каждому числу будет соотвествовать тот параметр который идет по счету, т.е.<br>
	 * 0 <=> "Name", 1 <=> "Fields" ...<br>
	 * ["Name","Fields", ...] <=> ["Name"=>"Name", "Fields"=>"Fields", ...]<br>
	 * <br>
	 * <pre>
	 * $Attributes = [
	 * 	"Name"			=> "",		//0
	 * 	"Fields"		=> [],		//1
	 * 	"Parent"		=> "",		//2
	 * 	"Multiple"		=> false,	//3
	 * 	"Active"		=> false,	//4
	 * 	"Date"			=> false,	//5
	 * 	"Showorder"		=> false,	//6
	 * 	"Synonym"		=> "",		//7
	 * 	"Template"		=> "",		//8
	 * 	"Head"			=> "",		//9
	 * 	"User"			=> false	//10
	 * 	"MySQLTableEngine"	=> "Aria",	//11
	 * ];</pre>
	 * Доступ к значениям атрибутов осуществляется также как и доступ к полю класса.<br>
	 * $name = $moduleOption->Name;
	 */
	
	public function __construct(array $attrs = array())
	{
		$this->Attributes = [
			"Name"				=> "",
			"Fields"			=> [],
			"Parent"			=> "",
			"Multiple"			=> false,
			"Active"			=> false,
			"Date"				=> false,
			"Showorder"			=> false,
			"Synonym"			=> "",
			"Template"			=> "",
			"Head"				=> "",
			"User"				=> false,
			"MySQLTableEngine"	=> "Aria"
		];
		parent::__construct($attrs);
	}
	
}
Цитата:
Нельзя Здесь, очевидно, две совершенно не логичные строчки кода. Не ясно за каким вообще они могут понадобиться.
Это не я придумал. Также есть понятие строк кода на единицу функциональности.

А рефакторить код всегда трудно и нудно, особенно если накопившаяся куча заплаток разбросана по всему проекту. Проекты на Haskell рефакторить не приходилось, но думаю ни чем не легче.
Kostia вне форума Ответить с цитированием
Старый 12.06.2013, 11:27   #33
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,692
По умолчанию

Примеры уже приводились:
Код:
--Быстрая сортировка Хоара
quickSort :: (Ord a) => [a] -> [a]
quickSort [] = []
quickSort (x:xs) = 
    let smallerSorted = quickSort [a | a <- xs, a <= x]
        biggerSorted = quickSort [a | a <- xs, a > x]
    in smallerSorted ++ [x] ++ biggerSorted
Код:
void quickSort (int a[], int l, int r)
{
   int i = l;
   int j = r;
   int x = a[(l + r) / 2];
   do
   {
      while (a[i] < x) i++;
      while (x < a[j]) j--;
      if (i <= j)
      {
         int temp = a[i];
         a[i++] = a[j];
         a[j--] = temp;
      }
   }
   while (i <= j);
   if (l < j) quickSort (a, l, j);
   if (i < r) quickSort (a, i, r);
}
В своей выпускной работе я использовал редакционное расстояние Левенштейна, которое лежит в основе системы тестирования знаний студентов.
Вот реализация на haskell:
Код:
import Data.List
 
 levenshtein s1 s2 = last $ foldl (transform s1) [0..length s1] s2 where
         transform str xs@(x:xs') c = res where
                 res = x + 1 : zipWith4 compute str xs xs' res
                 compute c' x y z = minimum [y + 1, z + 1, x + if c' == c then 0 else 1]
C#:
Код:
public static int LevenshteinDistance(string string1,string string2)
                {
                        if (string1==null) throw new ArgumentNullException("string1");
                        if (string2==null) throw new ArgumentNullException("string2");
                        int diff;                       
                        int [,] m = new int[string1.Length+1,string2.Length+1];
 
                        for (int i=0;i<=string1.Length;i++) m[i,0]=i;
                        for (int j=0;j<=string2.Length;j++) m[0,j]=j;
 
                        for (int i=1;i<=string1.Length;i++)
                                for (int j=1;j<=string2.Length;j++)
                                {
                                        diff=(string1[i-1]==string2[j-1])?0:1;
 
                                        m[i,j]=Math.Min(Math.Min(m[i-1,j]+1,
                                                                 m[i,j-1]+1),
                                                                 m[i-1,j-1]+diff);
                                }
 
                        return m[string1.Length,string2.Length];                
                }
При этом реализация на haskell будет работать с любыми типами относящимися к классу eq, в то время как на C# только со строками. Ну а свою шаблонную магию на C++ я не покажу =)
Kostia вне форума Ответить с цитированием
Старый 12.06.2013, 12:38   #34
MihalNik
МегаМодератор
СуперМодератор
 
Регистрация: 27.11.2012
Сообщений: 5,712
По умолчанию

Цитата:
Примеры уже приводились
Однако, заметьте, что коды по-прежнему без комментариев.
То есть предполагается, что я должен очень хорошо знать соответствующий язык, чтобы по коду догадаться, что выполняет программа.
Ах да, "сортировка Хоара" - т.е. посылаете в FAQ. Что вовсе не тру. А если из т.х. кода мне нужно будет поправить кусочек? И как только по-русски Вы все это толком прокомментируете (специально для таких идиотов как я) - тогда и посмотрим, о каком 10-ом сокращении в размере исходников будет идти речь. Хотя и сейчас подобное не наблюдается (так, например, я в сортировке вижу 6 строчек против 14). Но сравнивать, разумеется, нужно исключительно в символах.

Касательно же второго - не счесть косяков
Вот почему в # string1, а в Хаскеле только s1?
Благими намерениями устлана дорога на programmersforum.ru

Последний раз редактировалось MihalNik; 12.06.2013 в 12:55.
MihalNik вне форума Ответить с цитированием
Старый 12.06.2013, 13:18   #35
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

Цитата:
Сообщение от Kostia Посмотреть сообщение
Просто вот это:
Код:
[x for x in lst[1:] if x >= lst[0]]
На великом и могучем обычно называют генераторами списков, но в любом случае название сути не меняет.
Ненене, в случае с питоном генератор — совершенно другая штука. Генераторы вычисляют значения по мере обращения к ним, а list comprehension — сразу.

Код:
>>> mylist = range(7)
>>> lst = [x for x in mylist if x>3]
>>> gen = (x for x in mylist if x>3)
>>> lst
[4, 5, 6]
>>> gen
<generator object <genexpr> at 0x012142B0>
>>> gen.next()
4
>>> gen.next()
5
>>> gen.next()
6
Цитата:
Сообщение от Utkin Посмотреть сообщение
Лаконичность как основная тема имеет и обратные стороны. Конкретней - в 10 раз меньше кода означает как правило код в 10 раз менее понятный и соответственно в 10 раз более трудно отлаживаемый
Не означает. Меньший объём кода может достигаться не только за счёт продуманных языковых конструкций, но и за счёт динамической типизации/вывода типов. И если питон в этом плане с плюсами сравнивать не совсем корректно, то вот с хабра про плюсы и плюсы:

Код:
// C++03
for (std::vector<std::map<int, std::string>>::const_iterator it = container.begin(); it != container.end(); ++it)
{
   // do smth
}

// C++11
for (auto it = container.begin(); it != container.end(); ++it)
{
   // do smth
}
На ровном месте — лаконичнее, проще читается, проще отлаживается.

P.S.
You have a problem and decide to use STL.
Now you have a _Hashtable_iterator<std::pair<const basic_string<char, str::char_traits<char>, std::allocator<char> >, int>, basic_string<char, std::char_traits<char>, std::allocator<char > >
пыщь

Последний раз редактировалось JTG; 12.06.2013 в 13:47.
JTG вне форума Ответить с цитированием
Старый 12.06.2013, 16:30   #36
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,692
По умолчанию

Цитата:
Сообщение от JTG
На ровном месте — лаконичнее, проще читается, проще отлаживается.
Код:
// C++11
for(auto &it : container)
{
// do smth
}
А уж про списки инициализации вообще молчу, просто прелесть:
Код:
// C++11
struct Point
{
    double x,y;
    Point(double _x, double _y):x(_x),y(_y){/**/}
    Point & operator +=(const Point & p)
    {
        x+=p.x;
        y+=p.y;
        return *this;
    }
};
Point p = {0.3, 1.1};
p += {0.5, 1.1};
vector<string> vvs = {"мама","мыла","раму"};
Цитата:
Сообщение от MihalNik
Однако, заметьте, что коды по-прежнему без комментариев.
Код:
--Быстрая сортировка Хоара
quickSort :: (Ord a) => [a] -> [a] --эта строчка не обязательна, компиль ее сам выведет
quickSort [] = [] --пустой список не сортируем
{-
    Элементы меньшие либо равные голове списка идут в начало в отсортированом порядке,
    по середине следует голова,
    а потом все элементы большие головы, также отсортированные
-}
quickSort (x:xs) = 
    let smallerSorted = quickSort [a | a <- xs, a <= x] --сортируем левую часть
        biggerSorted = quickSort [a | a <- xs, a > x] --сортируем правую часть
    in smallerSorted ++ [x] ++ biggerSorted --склеиваем
Тоже самое, но в сокращенной форме:
Цитата:
qsort [] = []
qsort (x:xs) = qsort [y | y <- xs, y =< x ] ++ [x] ++ qsort [y | y <- xs, y > x]
Код на C комментировать не возьмусь, как и код вычисления расстояния Левенштейна, слишком уж толсто )
PS: x-голова списка, xs-все остальное
Kostia вне форума Ответить с цитированием
Старый 12.06.2013, 18:27   #37
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Цитата:
На ровном месте — лаконичнее, проще читается, проще отлаживается.
А вот как раз и пример гвоздей в алюминевый профиль, господа. Продолжаем заниматься фаллометрией? Ну-ну. Вопрос Хаскелю - если он такой крутой, то почему его знают единицы? Руби и тот более известен . Я конечно не особо гонялся, но ни где ни разу не встречал нормального и практически пригодного кода на Хаскеле. Типа там БД, чата, бухгалтерской программы и т.д. Или на французском говорят только о любви? Это как история с Обероном. Мегакрутой и научно обоснованный во всех отношениях. Практически идеал. Но как и любой идеал никогда не достижим.
Цитата:
И это тоже, но основное напрямую зависит от языка, на сколько просто анализировать его и можно ли вообще провести анализ.
Фу, бяка. Каждый программер рано или поздно начинает избретать своя язык, поскольку его не устраивают ему известные (думаю и ТС также чем-то недоволен и ищет совершенства). У Вас судя по всему опыт отрицательный. Потому что Вы бы в противном случае знали, что это зависит не от языка, а от производительности машины. Сишарп яркое тому доказательство.
Цитата:
Вполне сравнимы Дельфи и Ассемблер - как языки программирования, Шестерка и Мерседес - как автомобили.
Нормальные люди обычно сравнивают тогда когда результат обычно не известен заранее. Если же Вы ищите оправдание для себя лично, то можно также сравнивать запорожец с луноходом и восторгаться тем, что у запорожца багажник спереди. Давайте разовьем комедию до фарса и начнем сравнивать Хаскел с хтмлом.
Цитата:
И если питон в этом плане с плюсами сравнивать не совсем корректно,
Мысль которую я и пытаюсь донести - нельзя сравнить разные языки программирования. В крайнем случае родственные.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика

Последний раз редактировалось Utkin; 12.06.2013 в 18:50.
Utkin вне форума Ответить с цитированием
Старый 12.06.2013, 19:41   #38
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,692
По умолчанию

Цитата:
Каждый программер рано или поздно начинает избретать своя язык, поскольку его не устраивают ему известные (думаю и ТС также чем-то недоволен и ищет совершенства).
Отсюда и все проблемы, делают не как надо, а как удобнее, а потом жалуются )
Цитата:
начнем сравнивать Хаскел с хтмлом
Как? Один язык программирования, другой язык разметки.
Цитата:
Нормальные люди обычно сравнивают тогда когда результат обычно не известен заранее.
Мы не нормальные люди, мы программисты, математики и думать соответствующим образом должны.
Цитата:
Вопрос Хаскелю - если он такой крутой, то почему его знают единицы? Руби и тот более известен . Я конечно не особо гонялся, но ни где ни разу не встречал нормального и практически пригодного кода на Хаскеле.
Почему язык Haskell так непопулярен
Цитата:
Мысль которую я и пытаюсь донести - нельзя сравнить разные языки программирования.
Сравнение будет не корректным в случае если языки будут специализированные каждый под свою задачу, но мы ведем беседу про языки общего назначения, поэтому их сравнение не просто не не корректно, оно обязано быть, а критериев сравнения существует очень много. Зачем сравнивать, да хотя бы для того чтобы выделить кассы задач для решения которых один язык будет подходить лучше другого по определенным критериям.
Kostia вне форума Ответить с цитированием
Старый 12.06.2013, 20:32   #39
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Цитата:
Отсюда и все проблемы, делают не как надо, а как удобнее, а потом жалуются )
А как надо? Никто не знает, как надо. Дело в том, что есть большая разница в том как надо лично Вам и в том как надо лично мне. И если Вы один видите дао, то почему не запилите свой собственный мегаязык, который будет одной строкой решать мегазадачи?
Цитата:
Как? Один язык программирования, другой язык разметки.
О, кажется до Вас начинает доходить моя мысль.
Цитата:
Мы не нормальные люди, мы программисты, математики и думать соответствующим образом должны.
Сравнивая объекты, для которых отсутсвует операция сравнения Вы ведете себя никак программист. А как восторженный новичок, который в очередной раз говорит, что только его очередной язык супер-пупер (с++, дельфи, руби - нужное подчеркнуть), а все остальное есть унылое Г. Непонятно только почему на тупом и абсолютно не лаконичном Коболе миллионы строк кода, а на не крутом и отсталом Си вообще
миллиарды строк кода.
Цитата:
Почему язык Haskell так непопулярен
Так проскакивает очень дельная мысль о непопулярности и она имеет прямое отношение к Вам. Это психологические причины. Вы влюблены в язык, поскольку не сталкивались с чем-то подобным ранее. Пройдет время и эйфория сойдет на нет. Кроме того, там есть и чистой воды отмазка от решения проблемы, косвенно касающейся лаконичности кода - функциональное программирование требует не только другого взгляда. Оно требует и больше знаний, чем традиционные языки и воспринимать его сложней.
Цитата:
Зачем сравнивать, да хотя бы для того чтобы выделить кассы задач для решения которых один язык будет подходить лучше другого по определенным критериям.
Вы у создателей читать не пробовали? Иногда здорово помогает.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика

Последний раз редактировалось Utkin; 12.06.2013 в 20:36.
Utkin вне форума Ответить с цитированием
Старый 12.06.2013, 20:37   #40
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Самый лаконичный? Хм..
Стойт разделить :
1) Для программ сложность ХеллоВорда
(пожалуй Басик 4.5(прув))
2) Для остальных (наверное, С++
(прув))
Poma][a вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
вопросик самым опытным :-) Doholyan Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 25.08.2009 17:13
Проблема с синтаксисом? Geddar PHP 1 30.06.2008 16:44
Казус с синтаксисом???... Sota Общие вопросы C/C++ 6 17.07.2007 19:15