Re[25]: Стиль Дональда Эрвина Кнута
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 17.08.05 19:06
Оценка: +1
Здравствуйте, VladD2, Вы писали:

E>>Ага. Когда комплекс состоит из пяти процессов, которые работают на двух машинах (это пока, планируется еще большая распределенность), то просто обхахатываешься.


VD>Ну, да при этом отладчик уже не понадбится. Все равно работать не будет.


Ну на разскажи это нашим дежурным операторам. А то мужики и не знают поди.

E>>А вот пример ситуации, когда C++ может быть короче, чем Java или C#, или Ruby. Представь, что нужно прочитать оглавление каталога в контейнер чтобы затем уметь обращаться к этому контейнеру по трем индексам: по именам файлов, по дате их изменения и по имени их фладельца. Причем вставка или удаление элемента в/из контейнера должна приводить к автоматическому обновлению индексов.


E>>Вот в C++ для этого можно boost::multi_index применить.


VD>Опять таки С++ тут не причем. Это вопрос библиотеки. Выкинь буст и получишь более сложное решение.


Выкинь .NET Framework и получишь ли ты решение вообще?

<...пример поскипан...>
VD>Можешь ради хохмы попробовать то же саоме на С++ слабать. А потом сравнить время которое затратил, объем кода и понятность этого самого кода.

VD>Вот только это опять таки наличие довольно крутого класса. Тоже смое можно сделать и на МС++.


За пример спасибо. Как только дойдут руки до boost.1.33, так пришлю пример на C++.
... << RSDN@Home 1.1.4 stable rev. 510>>


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[25]: Стиль Дональда Эрвина Кнута
От: Павел Кузнецов  
Дата: 17.08.05 19:18
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Что касается решения на Шарпе, то твой буст тут отдыхает, так как в дотнет входит такой класс как DataTable. В нем встрена поддержка индексов и представлений. Вот наклепал на коленке за пару минут:

VD>
VD>        files.Columns.Add("Name", typeof(string));
VD>


А так можно?
files.Columns.Add("my data", typeof(MyData));

И чтобы по этой колонке искать можно было?
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[25]: Стиль Дональда Эрвина Кнута
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 17.08.05 23:38
Оценка: 84 (4) +1
Здравствуйте, VladD2, Вы писали:

VD>Что касается решения на Шарпе, то твой буст тут отдыхает, так как в дотнет входит такой класс как DataTable. В нем встрена поддержка индексов и представлений. Вот наклепал на коленке за пару минут:

VD>
VD>using System;
VD>using System.Data;
VD>using System.IO;

VD>class Program
VD>{
VD>    static void Main()
VD>    {
VD>        string path = @"c:\WINDOWS";

VD>        DirectoryInfo dir = new DirectoryInfo(path);
VD>        DataTable files = new DataTable("files");
        
VD>        files.Columns.Add("Name", typeof(string));
VD>        files.Columns.Add("Date", typeof(DateTime));
VD>        files.PrimaryKey = new DataColumn[] { files.Columns["Name"] };
VD>        // Создаем представление для поиска по имени
VD>        DataView nameView = new DataView(files);
VD>        nameView.Sort = "Name"; // это создаст индекс по полю "Name".
VD>        // Создаем представление для поиска по дате
VD>        DataView dateView = new DataView(files);
VD>        dateView.Sort = "Date"; // это создаст индекс по полю "Date".
VD>        // возиться с владельцем просто влом. Это не так просто. 
VD>        // Но с точки зрения задачи проблем нет. Нужно бобавить еще одно предствление.
VD>        // Если нужны индексы по нескольким полям, то это тоже не проблема.

VD>        foreach (FileInfo file in dir.GetFiles())
VD>            files.Rows.Add(file.Name, file.LastWriteTime);

VD>        DataRowView[] rows = nameView.FindRows("winnt256.bmp");
VD>        if (rows.Length > 0)
VD>            Console.WriteLine(rows[0]["Date"]);

VD>        rows = dateView.FindRows(
VD>            new FileInfo(Path.Combine(path, "winnt.bmp")).LastWriteTime);

VD>        foreach (DataRowView row in rows)
VD>            Console.WriteLine(row["Name"]);
VD>    }
VD>}
VD>


VD>Можешь ради хохмы попробовать то же саоме на С++ слабать. А потом сравнить время которое затратил, объем кода и понятность этого самого кода.


Алаверды:
#include <boost/filesystem/operations.hpp>
#include <boost/filesystem/path.hpp>

#include <boost/multi_index_container.hpp>
#include <boost/multi_index/mem_fun.hpp>
#include <boost/multi_index/ordered_index.hpp>

#include <iostream>

using namespace boost::filesystem;
using namespace boost::multi_index;
using boost::multi_index_container;

class    directory_item
    {
    private :
        std::string    name_;
        std::time_t    mtime_;
        boost::intmax_t size_;

    public :
        directory_item()
            :  mtime_( 0 ), size_( 0 )
            {}
        directory_item(
            const std::string & name,
            const std::time_t & mtime,
            boost::intmax_t size )
            :  name_( name ), mtime_( mtime ), size_( size )
            {}

        std::string name() const { return name_; }
        std::time_t mtime() const { return mtime_; }
        boost::intmax_t size() const { return size_; }
    };

std::ostream &
operator<<( std::ostream & o, const directory_item & item )
    {
        std::time_t t = item.mtime();

        return ( o << item.name() << ", "
            << std::string( std::ctime( &t ) ).substr( 0, 24 )
            << ", " << item.size() << std::endl );
    }

struct name {};
struct mtime {};
struct size {};

typedef multi_index_container<
                directory_item,
                indexed_by<
                        ordered_unique<
                                tag< name >,
                                const_mem_fun<
                                        directory_item, std::string, directory_item::name > >,
                        ordered_non_unique< 
                                tag< mtime >,
                                const_mem_fun<
                                        directory_item, std::time_t, directory_item::mtime > >,
                        ordered_non_unique<
                                tag< size >,
                                const_mem_fun<
                                        directory_item, boost::intmax_t, directory_item::size > >
                >
        >
        directory_container;

template< typename Tag, typename MultiIndexContainer >
void print_out_by(
    const MultiIndexContainer& s )
    {
        const typename index< MultiIndexContainer, Tag >::type& i = get< Tag >( s );

        typedef typename MultiIndexContainer::value_type value_type;

        std::copy(
                i.begin(), i.end(),
                std::ostream_iterator< value_type >( std::cout ) );
    }


int main( int argc, char* argv[] )
    {
        path full_path( initial_path() );

        if ( argc > 1 )
            full_path = system_complete( path( argv[1], native ) );
        else
            {
                std::cout << "\nusage:   simple_ls [path]" << std::endl;
                return 1;
            }

        if ( !exists( full_path ) )
            {
                std::cout << "\nNot found: " << full_path.native_file_string() << std::endl;
                return 1;
            }

        if ( is_directory( full_path ) )
            {
                directory_container result;

                directory_iterator end_iter;
                for ( directory_iterator dir_itr( full_path );
                        dir_itr != end_iter;
                        ++dir_itr )
                    {
                        try
                            {
                                bool directory = is_directory( *dir_itr );

                                result.insert(
                                        directory_item(
                                                dir_itr->leaf() + ( directory ? "/" : "" ),
                                                last_write_time( *dir_itr ),
                                                is_directory( *dir_itr ) ? 0 : file_size( *dir_itr ) ) );
 
                            }
                        catch ( const std::exception & ex )
                            {
                                std::cerr << dir_itr->leaf() << " " << ex.what() << std::endl;
                            }
                    }

                std::cout << "result.size: " << result.size() << std::endl;
                std::cout << "\nordered by name:" << std::endl;
                print_out_by< name >( result );

                std::cout << "\nordered by modification time:" << std::endl;
                print_out_by< mtime >( result );

                std::cout << "\nordered by size:" << std::endl;
                print_out_by< size >( result );
            }
    }


Жирным выделен код, который непосредственно относится к работе с контейнером.
Класс directory_item написан так же мной. Все остальное безбожно утянуто из примеров Boost::MultiIndex и Boost::Filesystem.

Проектный файл (с Boost.Build разбираться было в лом, поэтому использовал свою приблуду):
require 'mxx_ru/cpp'

Mxx_ru::setup_target(
    Mxx_ru::Cpp::Exe_target.new( "simple_ls.rb" ) do

        rtl_mode Mxx_ru::Cpp::RTL_SHARED
        threading_mode Mxx_ru::Cpp::THREADING_MULTI
        runtime_mode Mxx_ru::Cpp::RUNTIME_RELEASE

        lib "boost_filesystem-vc71-mt-1_32.lib"

        target "simple_ls"

        cpp_source "simple_ls.cpp"

    end
)


Компилируется:
ruby simple_ls.rb


Запускается:
simple_ls <имя каталога>


Вот содержимое каталога на котором это все тестировалось:
-rw-rw-rw-   1 user     group       16384 Aug 18 02:12 .simple_ls.cpp.swp
-rw-rw-rw-   1 user     group         142 Aug 18 01:53 Jamfile.v2
-rw-rw-rw-   1 user     group          15 Aug 18 02:58 cerr.log
drwxrwxrwx   1 user     group           0 Aug 18 03:15 o
-rw-rw-rw-   1 user     group        3386 Aug 18 03:05 simple_ls.cpp
-rwxrwxrwx   1 user     group       28672 Aug 18 03:15 simple_ls.exe
-rw-rw-rw-   1 user     group         343 Aug 18 03:14 simple_ls.rb


И вот результат работы:
result.size: 7

ordered by name:
.simple_ls.cpp.swp, Thu Aug 18 02:12:26 2005, 16384
Jamfile.v2, Thu Aug 18 01:53:41 2005, 142
cerr.log, Thu Aug 18 02:58:26 2005, 15
o/, Thu Aug 18 03:15:19 2005, 0
simple_ls.cpp, Thu Aug 18 03:05:01 2005, 3386
simple_ls.exe, Thu Aug 18 03:15:20 2005, 28672
simple_ls.rb, Thu Aug 18 03:14:52 2005, 343

ordered by modification time:
Jamfile.v2, Thu Aug 18 01:53:41 2005, 142
.simple_ls.cpp.swp, Thu Aug 18 02:12:26 2005, 16384
cerr.log, Thu Aug 18 02:58:26 2005, 15
simple_ls.cpp, Thu Aug 18 03:05:01 2005, 3386
simple_ls.rb, Thu Aug 18 03:14:52 2005, 343
o/, Thu Aug 18 03:15:19 2005, 0
simple_ls.exe, Thu Aug 18 03:15:20 2005, 28672

ordered by size:
o/, Thu Aug 18 03:15:19 2005, 0
cerr.log, Thu Aug 18 02:58:26 2005, 15
Jamfile.v2, Thu Aug 18 01:53:41 2005, 142
simple_ls.rb, Thu Aug 18 03:14:52 2005, 343
simple_ls.cpp, Thu Aug 18 03:05:01 2005, 3386
.simple_ls.cpp.swp, Thu Aug 18 02:12:26 2005, 16384
simple_ls.exe, Thu Aug 18 03:15:20 2005, 28672


На все про все, включая исталляцию boost-1_32, компиляцию Boost.Filesystem, изучение документации, поиск и переработку примеров, написание моего кода и тестирование ушло около одного часа двадцати минут. Редактировал все в Vim-е. Документацию смотрел в Opera, куски кода из примеров boost-а воровал Far-ом. Компилировался по ходу дела раз 20-30, запускался -- раз 10-15. Прошу так же учесть, что до этого из Boost-а я использовал только Boost.Test, т.е., фактически, это моя первая реальная программа на Boost-е.




Сравнивать то, что получилось у тебя и у меня не берусь. Пусть другие сравнивают.

Лично мне кажется, что у меня получился вполне реюзабельный класс directory_container. У тебя же захардкоденное заполнение одного DataTable и одного DataView. При попытке применить это где-то еще все приведенные тобой действия придется повторять.

Кроме того, в класс directory_item можно легко добавить дополнительные поля, которые не должны участвовать в индексации, и directory_container от этого не изменится. Что придется делать в твоем подходе -- бог его знает. На вскидку кажется, что придется добавлять дополнительные столбцы. Но это как-то не по объекто-ориентированному получается.

Глядя на собственный код могу сказать, что мне кажется слишком тяжеловесной конструкция в typedef. Хотя писать ее было легко. И после знакомства с Boost.MultiIndex воспринимается она легко. Но вот для постороннего она может выглядеть жутковато.
... << RSDN@Home 1.1.4 stable rev. 510>>


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[21]: Стиль Дональда Эрвина Кнута
От: ЯпонИц Россия www.yaponiz.com
Дата: 18.08.05 04:43
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Если посадили, то посадили. Но есть море народа который провобавл разные вещи.


К сожалению, это "море" слишком мало чтобы говорить:

Все те кто сегодня привык к IDE или там скажем Мультиэдиту, все они когда-то стояли перед выбором и скорее всего пробовали разные варианты.


А ещё есть такая вещь как время на "попробовать". Согласитесь, та же VS, имея небольшой порог вхождения, "подсаживает" на себя буквально за несколько минут, как раз "Hello World" напишешь.
Я не волшебник, я только учусь.
Posted by RSDN@HOME.
Re[26]: Стиль Дональда Эрвина Кнута
От: VladD2 Российская Империя www.nemerle.org
Дата: 18.08.05 08:40
Оценка:
Здравствуйте, eao197, Вы писали:

E>На все про все, включая исталляцию boost-1_32, компиляцию Boost.Filesystem, изучение документации, поиск и переработку примеров, написание моего кода и тестирование ушло около одного часа двадцати минут. Редактировал все в Vim-е. Документацию смотрел в Opera, куски кода из примеров boost-а воровал Far-ом. Компилировался по ходу дела раз 20-30, запускался -- раз 10-15. Прошу так же учесть, что до этого из Boost-а я использовал только Boost.Test, т.е., фактически, это моя первая реальная программа на Boost-е.


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

E>Сравнивать то, что получилось у тебя и у меня не берусь. Пусть другие сравнивают.


E>Лично мне кажется, что у меня получился вполне реюзабельный класс directory_container. У тебя же захардкоденное заполнение одного DataTable и одного DataView. При попытке применить это где-то еще все приведенные тобой действия придется повторять.


Это уже не важно. Передомной и не стояла задача написать повторно используемое решение. Я просто продемонстрировал способ решения.

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

Толку же от такой пенисометрии не много, так как это опять сравнение библиотек. Причес со стороны С++ не стандартных (внешних). Не составит труда создать и более точный аналог Boost::MultiIndex. Просто в этом нет потребности, а без нее трахаться влом.
... << RSDN@Home 1.2.0 alpha rev. 591>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[26]: Стиль Дональда Эрвина Кнута
От: VladD2 Российская Империя www.nemerle.org
Дата: 18.08.05 08:40
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>А так можно?

ПК>
ПК>files.Columns.Add("my data", typeof(MyData));
ПК>

ПК>И чтобы по этой колонке искать можно было?

Да, хоть "Date & time". Это всего лишь строка которая ставится в соотвествие с индексом колонки.
... << RSDN@Home 1.2.0 alpha rev. 591>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[26]: Стиль Дональда Эрвина Кнута
От: VladD2 Российская Империя www.nemerle.org
Дата: 18.08.05 08:40
Оценка:
Здравствуйте, eao197, Вы писали:

VD>>Опять таки С++ тут не причем. Это вопрос библиотеки. Выкинь буст и получишь более сложное решение.


E>Выкинь .NET Framework и получишь ли ты решение вообще?


Буст библиотека внешня. К С++ отношения не имеет. Фрэймворк же часть рантайма.
... << RSDN@Home 1.2.0 alpha rev. 591>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[22]: Стиль Дональда Эрвина Кнута
От: VladD2 Российская Империя www.nemerle.org
Дата: 18.08.05 08:40
Оценка:
Здравствуйте, ЯпонИц, Вы писали:


ЯИ>К сожалению, это "море" слишком мало чтобы говорить:

ЯИ>

Все те кто сегодня привык к IDE или там скажем Мультиэдиту, все они когда-то стояли перед выбором и скорее всего пробовали разные варианты.


Более чем достаточно.

ЯИ>А ещё есть такая вещь как время на "попробовать". Согласитесь, та же VS, имея небольшой порог вхождения, "подсаживает" на себя буквально за несколько минут, как раз "Hello World" напишешь.


О том и речь. А вот первый трах с Емаксом очень часто заканчивается отказом от него. Лично у меня было и менно так. Причем я уже точно понимал, что он не хуже чем VS и т.п.
... << RSDN@Home 1.2.0 alpha rev. 591>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[27]: Стиль Дональда Эрвина Кнута
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 18.08.05 08:57
Оценка: +1
Здравствуйте, VladD2, Вы писали:

E>>На все про все, включая исталляцию boost-1_32, компиляцию Boost.Filesystem, изучение документации, поиск и переработку примеров, написание моего кода и тестирование ушло около одного часа двадцати минут. Редактировал все в Vim-е. Документацию смотрел в Opera, куски кода из примеров boost-а воровал Far-ом. Компилировался по ходу дела раз 20-30, запускался -- раз 10-15. Прошу так же учесть, что до этого из Boost-а я использовал только Boost.Test, т.е., фактически, это моя первая реальная программа на Boost-е.


VD>Ну, что же учитывая, что код больше далеко не в двадцать раз уже можно сделать вывод о том, что трахался ты намного больше и к тому же это явно противоречит идеи о том, что в любом коде одинаковое количество ошибок.


<offtopic>
Тезис по поводу "трахания намного больше" нуждается в доказательстве. Тебе не кажется?
Я так понимаю, что здесь в обсуждениях к словам собеседника проявляется высокий уровень доверия. В противном случае разговаривать не о чем, т.к. нет никакого доверия твоим словам о том, что ты сделал свой пример за 5 минут.
</offtopic>

Кроме того я не понял вот этого: "явно противоречит идеи о том, что в любом коде одинаковое количество ошибок". Из чего именно следует такой вывод?

E>>Сравнивать то, что получилось у тебя и у меня не берусь. Пусть другие сравнивают.


E>>Лично мне кажется, что у меня получился вполне реюзабельный класс directory_container. У тебя же захардкоденное заполнение одного DataTable и одного DataView. При попытке применить это где-то еще все приведенные тобой действия придется повторять.


VD>Это уже не важно. Передомной и не стояла задача написать повторно используемое решение. Я просто продемонстрировал способ решения.


Я тоже, но при этом получил реюзабильное решение. За просто так.
Имхо, это имеет практическую ценность.

VD>Главное другое. Главное, что твои предположения о приемуществе С++ в данной задаче оказались неверным. Думаю ты не будешь спорить по этому поводу?


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

VD>Толку же от такой пенисометрии не много, так как это опять сравнение библиотек. Причес со стороны С++ не стандартных (внешних). Не составит труда создать и более точный аналог Boost::MultiIndex. Просто в этом нет потребности, а без нее трахаться влом.


Использовать DataView тебе не в лом, потому что он написан.
Использовать Boost::MuitiIndex мне так же не в лом, потому, что он написан.

Разсуждения о стандартных/нестандартных библиотеках идут лесом. Т.к. библиотека есть, у нее нормальная лицензия, нормальная поддержка большого количества платформ и на моем компиляторе с ней нет никаких проблем. Поэтому я не вижу _никаких_ препятствий к ее использованию.
... << RSDN@Home 1.1.4 stable rev. 510>>


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[27]: Стиль Дональда Эрвина Кнута
От: Cyberax Марс  
Дата: 18.08.05 11:01
Оценка: +2
VladD2 wrote:

> E>Выкинь .NET Framework и получишь ли ты решение вообще?

> Буст библиотека внешня. К С++ отношения не имеет. Фрэймворк же часть
> рантайма.

Что такое "C++"? Если язык, опрделенный станартом ISO/IEC, то тогда что
будет, если в .NET использовать ТОЛЬКО стандартизованую часть Framework'а?

--
С уважением,
Alex Besogonov (alexy@izh.com)
Posted via RSDN NNTP Server 1.9
Sapienti sat!
Re[27]: Стиль Дональда Эрвина Кнута
От: adontz Грузия http://adontz.wordpress.com/
Дата: 18.08.05 11:35
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Буст библиотека внешня.


А у Си++ все бибилотеки внешние. Да и не так уж неотделим C# от рантайма. Project\Properties\Configuration Properties\Advanced\Do not Use Mscorlib
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[27]: Стиль Дональда Эрвина Кнута
От: Павел Кузнецов  
Дата: 18.08.05 12:11
Оценка:
VladD2,

> VD>>Опять таки С++ тут не причем. Это вопрос библиотеки. Выкинь буст и получишь более сложное решение.

>
> E>Выкинь .NET Framework и получишь ли ты решение вообще?
>
> Буст библиотека внешня. К С++ отношения не имеет. Фрэймворк же часть рантайма.

И, скажем, в Моно присутствует в том же объеме?..
Posted via RSDN NNTP Server 2.0 beta
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[27]: Стиль Дональда Эрвина Кнута
От: Павел Кузнецов  
Дата: 18.08.05 12:15
Оценка: +1 -1
VladD2,

> ПК>А так можно?

> ПК>
> ПК>files.Columns.Add("my data", typeof(MyData));
> ПК>

> ПК>И чтобы по этой колонке искать можно было?

> Да, хоть "Date & time". Это всего лишь строка которая ставится в соотвествие с индексом колонки.


Я не о названии, а о типе данных. Здесь говорится буквально следующее:

The DataType property supports the base .NET Framework data types shown below:
Boolean
Byte
Char
DateTime
Decimal
Double
Int16
Int32
Int64
SByte
Single
String
TimeSpan
UInt16
UInt32
UInt64

Posted via RSDN NNTP Server 2.0 beta
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[28]: Стиль Дональда Эрвина Кнута
От: Павел Кузнецов  
Дата: 18.08.05 13:12
Оценка: :)
P.S.

>> ПК>А так можно?

>> ПК>
>> ПК>files.Columns.Add("my data", typeof(MyData));
>> ПК>

>> ПК>И чтобы по этой колонке искать можно было?

>> Да, хоть "Date & time". Это всего лишь строка которая ставится в соотвествие с индексом колонки.


> Я не о названии, а о типе данных. <...>


Точнее, запихать-то туда объект своего типа данных получается. Главное, можно ли отсортировать DataView по колонке своего типа данных, и по своему условию сортировки?
Posted via RSDN NNTP Server 2.0 beta
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[28]: Стиль Дональда Эрвина Кнута
От: VladD2 Российская Империя www.nemerle.org
Дата: 18.08.05 17:26
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Что такое "C++"? Если язык, опрделенный станартом ISO/IEC, то тогда что

C>будет, если в .NET использовать ТОЛЬКО стандартизованую часть Framework'а?

Рассуждения о сферокониках меня не интересуют.
... << RSDN@Home 1.2.0 alpha rev. 591>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[28]: Стиль Дональда Эрвина Кнута
От: VladD2 Российская Империя www.nemerle.org
Дата: 18.08.05 17:26
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>И, скажем, в Моно присутствует в том же объеме?..


ДатаТэйбл? Да.
... << RSDN@Home 1.2.0 alpha rev. 591>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[29]: Стиль Дональда Эрвина Кнута
От: VladD2 Российская Империя www.nemerle.org
Дата: 18.08.05 17:26
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>Точнее, запихать-то туда объект своего типа данных получается. Главное, можно ли отсортировать DataView по колонке своего типа данных, и по своему условию сортировки?


А почему нет? Реализуй IComparable (или IConvertible с приведением к другому типу) и вперед.


ЗЫ

Я вообще с тебя порожаюсь периодически. Такое ощущение, что ты дотнет все за неработающую игрушку держишь. Удивляшся, что что-то работает.
... << RSDN@Home 1.2.0 alpha rev. 591>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[28]: Стиль Дональда Эрвина Кнута
От: VladD2 Российская Империя www.nemerle.org
Дата: 18.08.05 17:26
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>Я не о названии, а о типе данных.


using System;
using System.Data;
using System.IO;

class Program
{
    class A : IComparable
    {
        public A(int i) { I = i; }
        public int I;

        #region IComparable Members

        public int CompareTo(object obj)
        {
            if (obj == null)
                return 1;

            return ((A)obj).I.CompareTo(I);
        }

        #endregion
}

    static void Main()
    {

        string path = @"c:\WINDOWS";

        DirectoryInfo dir = new DirectoryInfo(path);
        DataTable files = new DataTable("files");

        files.Columns.Add("Name", typeof(string));
        files.Columns.Add("Date", typeof(DateTime));
        files.Columns.Add("A", typeof(A));
        files.PrimaryKey = new DataColumn[] { files.Columns["Name"] };
        // Создаем представление для поиска по имени
        DataView nameView = new DataView(files);
        nameView.Sort = "Name"; // это создаст индекс по полю "Name".
        // Создаем представление для поиска по дате
        DataView dateView = new DataView(files);
        dateView.Sort = "Date"; // это создаст индекс по полю "Date".

        DataView aView = new DataView(files);
        aView.Sort = "A";
        // это создаст индекс по полю "Date".
        // возиться с владельцем просто влом. Это не так просто. 
        // Но с точки зрения задачи проблем нет. Нужно бобавить еще одно предствление.
        // Если нужны индексы по нескольким полям, то это тоже не проблема.
        int i = 0;
        foreach (FileInfo file in dir.GetFiles())
            files.Rows.Add(file.Name, file.LastWriteTime, new A(i++));

        DataRowView[] rows = nameView.FindRows("winnt256.bmp");
        if (rows.Length > 0)
            Console.WriteLine(rows[0]["Date"]);

        rows = dateView.FindRows(
                new FileInfo(Path.Combine(path, "winnt.bmp")).LastWriteTime);

        foreach (DataRowView row in rows)
            Console.WriteLine(row["Name"]);

        Console.WriteLine("Find by A:");
        rows = aView.FindRows(new A(10));

        foreach (DataRowView row in rows)
            Console.WriteLine(row["Name"]);
    }
}
... << RSDN@Home 1.2.0 alpha rev. 591>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[28]: Стиль Дональда Эрвина Кнута
От: VladD2 Российская Империя www.nemerle.org
Дата: 18.08.05 17:26
Оценка: :)
Здравствуйте, eao197, Вы писали:

E><offtopic>

E>Тезис по поводу "трахания намного больше" нуждается в доказательстве. Тебе не кажется?
E>Я так понимаю, что здесь в обсуждениях к словам собеседника проявляется высокий уровень доверия. В противном случае разговаривать не о чем, т.к. нет никакого доверия твоим словам о том, что ты сделал свой пример за 5 минут.
E></offtopic>

И? Если ты моим словам доверяшь, то поверь что действительно где-то 5 минут (ну, может 7... это не суть важно). И действительно заработало со второй попытки. Отладки небыло вообще. Ошибка была в том, что в строке:
        files.Columns.Add("Date", typeof(DateTime));

я опечатался и влепил DataView вместо DateTime. Получилось просто из спешки опечатался написав Data вместо Date и комплитом докомплитил с гореча. Первый же запуск выдал осмысленное исключение. После испрвления типа все сразу заработало.

Сравнивая с тоим расскзаом я и делаю вывод. Пять минут без траха против 20+ с трахом.

E>Кроме того я не понял вот этого: "явно противоречит идеи о том, что в любом коде одинаковое количество ошибок". Из чего именно следует такой вывод?


Сравни количество компиляций/запусков которое потребовалось и мне. Твой код больше максимум в два-три раза. А траха в 20. Один к одному как в твоих рассказах о Руби. Что собственно и должно быть.

VD>>Это уже не важно. Передомной и не стояла задача написать повторно используемое решение. Я просто продемонстрировал способ решения.


E>Я тоже, но при этом получил реюзабильное решение.


И? Молодец сделал лишнее.

E> За просто так.


Как сказать. Учитывая затраченые силы я бы так не сказал.

E>Имхо, это имеет практическую ценность.


А по-моему для данного примера это не важно.

VD>>Главное другое. Главное, что твои предположения о приемуществе С++ в данной задаче оказались неверным. Думаю ты не будешь спорить по этому поводу?


E>Я же сказал, что не мне оценивать. Т.к. программы получились ну совершенно разные.


Разные не разные. Но даже младенец заметит, что никакого превосходство у плюсов тут нет.

E>Использовать DataView тебе не в лом, потому что он написан.

E>Использовать Boost::MuitiIndex мне так же не в лом, потому, что он написан.

Ага. Вот только есть небольшая разница. Для того чтобы подключить Буст прийдется лезть в Интернет... качать его... распаковывать... настраивать пути... искать нужные инклюды. Мне же пришлось дописать ровно одру строку код:
using System.Data;


E>Разсуждения о стандартных/нестандартных библиотеках идут лесом.


Да нет. Не идут, так как лично ты несколько раз говорил, что мог бы использовать ххх из буста, но вот не привык и т.п. Это как раз и есть та самая разница.

ЗЫ

В общем, обсуждать по-моему в данном ответвлении болше нечего. Твое утвреждение о приемуществе С++ в данной задачей яляется а) не частным, так как ссылается на библиотечный класс, б) не подтвердилось на практике так как дотнет обладает не менее мощьным встроенным классом.

Можно конечно порссуждать об эффетивности, но думаю это уже будет очередное лукавство.
... << RSDN@Home 1.2.0 alpha rev. 591>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[29]: Стиль Дональда Эрвина Кнута
От: Павел Кузнецов  
Дата: 18.08.05 17:53
Оценка:
VladD2,

> ПК>Я не о названии, а о типе данных.

>
>
> <...>
>


Первая попытка, на работе, не удалась:

d:\users\pkuznetsov\test\csharpconsoleapplication\class1.cs(48,13): error CS1501: No overload for method 'Add' takes '3' arguments
c:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\system.data.dll: (Related file)

Posted via RSDN NNTP Server 2.0 beta
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.