Модераторы: korob2001, ginnie

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Учусь ООП. Как лучше запроектировать класс? 
:(
    Опции темы
AndreyCH
Дата 17.3.2009, 18:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 24.9.2007

Репутация: нет
Всего: нет



Есть обыкновенный XML
Код

<nw>
  <name>Test1</name>
  
  <date>
    <core>
       <pv> Text1<pv>
       <pv> Text2<pv>      
     </core>
    <dt>16-03-2008</dе>
    <dt>18-05-2008</dt>
  </date>
</nw>



Есть простой класс назовем его SimpleTag. 
Код

package XMLTag;
use strict;
require "util.pl";
use fields qw(tagName tagValue); 
...
1;

Он служит для хранения простых значений и имеет 2 поля (название тэга tagName и его значение tagValue) и какие-то методы обработки их...
Для вложенных тэгов нужен класс compoundTag где для значений будет массив объектов того же типа (compoundTag 

поле tagName = "<nw>" 
поле tagValue = массив как compoundTag (<core>или<date>)так и SimpleTag (<name> или <pv>) - вот здесь и затруднения.

Помогите пожалуйста написать код для класса compoundTag (если можно, то пример как это нужно делать) 
PM   Вверх
NuINu
Дата 18.3.2009, 10:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 131
Регистрация: 19.7.2008

Репутация: 5
Всего: 6



Уважаемый AndreyCH, вы мыслите неверно.
и соответственно ставите задачу не правильно.

объяснюсь. то что вы написали это мысли в структурной парадигме, где первичную роль играет структура данных.
а вам надо сделать как я понял, объектную иерархию. 
так вот в объектной парадигме, первичную роль играют то как объекты взаимодействуют друг с другом, т.е на какие вопросы они отвечают какие ДЕЙСТВИЯ они делают.

поэтому при определении класса, вы в первую очередь определите МЕТОДЫ, которые должен выполнять ваш объект.
из указанных данных не понятно что должен делать SimpleTag, именно ДЕЛАТЬ а не что он будет внутри себя хранить(это дело десятое).
и тем более не понятно что будет делать compoundTag.
по идее наследования, они чтото должны делать одинаковое. иначе смысла их объединять в одну иерархию нет никакого.

поэтому и помочь вам в вашем вопросе, крайне затруднительно.
PM MAIL   Вверх
AndreyCH
Дата 18.3.2009, 13:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 24.9.2007

Репутация: нет
Всего: нет



Да-да, Вы абсолютно правы! Хоть мыслю я в правильной парадигме, а вот выразить мысль не сумел.

Итак есть древовидная структура XML (как пример)
тэг содержит данные (поле value) и название (поле name) нам нужно эти данные получить (getName и getValue) и установить (setName и setValue)
так же тэг может содержать другие тэги внутри (список тэгов: соотвественно методы для работы со списком).


ps. ну и как всегда пока отвечал сам понял что же мне нужно. 

PM   Вверх
sir_nuf_nuf
Дата 18.3.2009, 18:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 920
Регистрация: 6.1.2008

Репутация: 14
Всего: 31



AndreyCH, вы это для собственного развлеения делаете или серьезно ?

Если серьезно, то - это уже сделали за вас. - разработали Document Object Model.
Настоятельно рекомендую не ихобретать велосипед и использовать какую либо библиотеку для работы
с XML.

А вообщем NuINu прав - нужно сначала решить что будут делать ваши классы.
Вообще иногда классы строются как раз исходя из соображений, что они хранят (так называемые Data-Object)
Ну наприрер класс для хранения Даты. Такие классы как правило делаются Immutable, т.е. содержимое их
не может меняться.

ну вот простой хотя и бессмысленный пример
Код

package ComplexNum;

use base qw(Class::Accessor);

__CLASS__->mk_ro_accessors qw(real imaginary);

sub add {
  my ($self, $another) = @_;
  return __CLASS__->new($self->real + $another->real, $self->imaginary + $another->imaginary);
}

1;



--------------------
user posted image
user posted image
PM MAIL Jabber   Вверх
AndreyCH
Дата 19.3.2009, 10:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 24.9.2007

Репутация: нет
Всего: нет



Это делается лишь наполовину для собственного развлечения. smileСейчас поясню. 
XML нужен, чтобы наглядно отображать древовидные данные.
Структура задано жестко и никогда не изменится. smile 
Сейчас как раз все реализовано XML::Simple
А вот то, что я спросил - это как раз мое обучение ну и для скорости работы.

Раз уж так, то есть вопрос: внутри класса XmlSimple нужно поле типа XmlSimple (то есть ссылку на такой же объект, который) как правильно его создать?



PM   Вверх
gcc
Дата 19.3.2009, 12:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 2691
Регистрация: 25.4.2008
Где: %&й

Репутация: 1
Всего: 17



подскажите чем Class::Accessor лучше от обычного ООП bless + перезагрузка? читаю не могу понять чем лучше и где приемущества
все ли это используют?

Это сообщение отредактировал(а) gcc - 19.3.2009, 12:58
PM WWW ICQ Skype GTalk Jabber   Вверх
KSURi
Дата 19.3.2009, 13:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 887
Регистрация: 8.6.2006
Где: Russia

Репутация: 20
Всего: 27



Цитата(gcc @  19.3.2009,  12:58 Найти цитируемый пост)
ООП bless + перезагрузка

Это вы про что? И какая связь у этого с модулем Class::Accessor, который автоматически генерирует методы аксесоров и мутаторов для ваших классов?


--------------------
Died at Life.pl line 21
PM Jabber   Вверх
gcc
Дата 19.3.2009, 14:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 2691
Регистрация: 25.4.2008
Где: %&й

Репутация: 1
Всего: 17



ну а что это такое? в чем разница? или это просто название?

то есть это просто определить на сетер и гетер, наследование контрутора и перезагрузка операторов и всё?

в чем приемущестово?



Это сообщение отредактировал(а) gcc - 19.3.2009, 14:03
PM WWW ICQ Skype GTalk Jabber   Вверх
KSURi
Дата 19.3.2009, 14:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 887
Регистрация: 8.6.2006
Где: Russia

Репутация: 20
Всего: 27



gcc, вы извините, но у вас какой-то набор слов получается в сообщении. Не могу выделить смысловую часть.

Вообще Class::Accessor используется для того, чтобы избавиться от написания однообразных методов типа
Код

sub foo {
 my $self = shift;

 @_ ? $self->{foo} = shift : return $self->{foo}
}

для каждого атрибута объекта вашего класса.


--------------------
Died at Life.pl line 21
PM Jabber   Вверх
AndreyCH
Дата 19.3.2009, 18:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 24.9.2007

Репутация: нет
Всего: нет



Вот набросал простенький класс... Покритикуйте пожалуйста, может что неправильно, неэффективно написал!

obj.pl
Код

#!/usr/bin/perl 
package MyXml;
use strict;

  sub new{
    my $classname = shift;
    my $self = { };
    $self->{TAGNAME}= "RootXML";
    my @array;
    $self->{SUBXML} = \@array;
    bless($self, $classname);
    return $self;
  }

  sub getTagName{
    my $self = shift;
    return $self->{TAGNAME};
  }

  sub setTagName{
    my $self = shift;
    $self->{TAGNAME} = shift;
  }

  sub addSubXml{
    my $self = shift;
    push (@{$self->{SUBXML}}, shift)
  }

  sub getSubXml{
    my $self = shift;
    return $self->{SUBXML}->[shift];#@_[0]
  }

1;


а это его тестик test.pl
Код

#!/usr/bin/perl
require "obj.pl";
use strict;

my $rootxml = MyXml->new();

my $subxml1 = MyXml->new();
my $subxml2 = MyXml->new();

$subxml1->setTagName("SubXML1");
$subxml2->setTagName("SubXML2");

print $rootxml->getTagName(), "\n";

$rootxml->addSubXml($subxml1);
$rootxml->addSubXml($subxml2);

print $rootxml->getSubXml(0)->getTagName();



PM   Вверх
ginnie
Дата 19.3.2009, 21:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 38
Всего: 49



Цитата(AndreyCH @  19.3.2009,  18:14 Найти цитируемый пост)
Покритикуйте пожалуйста, может что неправильно, неэффективно написал!


AndreyCH, в глаза бросилось

Код

    my $self = { };
    $self->{TAGNAME}= "RootXML";
    my @array;
    $self->{SUBXML} = \@array;





--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
gcc
Дата 20.3.2009, 03:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 2691
Регистрация: 25.4.2008
Где: %&й

Репутация: 1
Всего: 17



KSURi, не понимаю...

ну так и что из этого "что он для того, чтобы избавиться от написания однообразных методов типа"?
PM WWW ICQ Skype GTalk Jabber   Вверх
AndreyCH
Дата 20.3.2009, 08:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 24.9.2007

Репутация: нет
Всего: нет



ginnie, прокомментируйте пожалуйста что именно не так! 
Инициализацию в конструкторе $self->{TAGNAME}= "RootXML"; я сделал, только для того что бы проверить как все работает, 
а вот с ссылкой на массив не очень понимаю... Или его не нужно инициализировать в конструкторе или что не так? smile
PS. perl ом я занимаюсь для удовольствия - пишу на нем небольшой ресурс. А основная работа у меня на Java (раньше на C++) . Если сказать, что от перла крышу сносит, это не чего не сказать. Непривычно абсолютно ВСЕ! smile Иногда задаю себе вопрос "что же они такое курили когда это делали???" (только пожалуйста без обид, это я шутя)... Поэтому многие абсолютно простые и понятные для перловода вещи выводят меня из душевного равновесия и заставляют вдумчиво перечитывать раз за разом, пока дойдет... Отсюда и вопросы на "детские темы", да еще и путаться начинаю, у людей складывается ощущение, что я не понимаю что делаю...  smile А это всего лишь влияние Перла на неокрепшую психику. 
PM   Вверх
shamber
Дата 20.3.2009, 10:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1422
Регистрация: 5.9.2006
Где: Россия

Репутация: 17
Всего: 18



AndreyCH
а если так
Код

$self->{SUBXML} =[];

PM MAIL Jabber   Вверх
gcc
Дата 20.3.2009, 11:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 2691
Регистрация: 25.4.2008
Где: %&й

Репутация: 1
Всего: 17



AndreyCH, может хэши лучше использовать? (именуемые параметры)

интересно, а как perl на много сложнее чем Java, C++ ? smile

перебрать:
Код

 foreach @{$self->{SUBXML}} {
print $_;
}


добавить так:
Код

push @{$self->{SUBXML}}, 'один эелемент';


Код

sub new {

    my ( $class, %common ) = @_;
    my $self = {
        se      => undef,
        cookie  => undef,
        env     => undef,
        session => undef,
        he      => undef,
        p       => undef,
        query   => undef
    };

    $self->{'se'}      = $common{'se'}      if $common{'se'};
    $self->{'session'} = $common{'session'} if $common{'session'};
    $self->{'he'}      = $common{'he'}      if $common{'he'};
    $self->{p}       = $common{p}       if $common{p};
    $self->{query}   = $common{query}   if $common{query};

bless $self, $class;

    return $self;
}


Это сообщение отредактировал(а) gcc - 20.3.2009, 11:35
PM WWW ICQ Skype GTalk Jabber   Вверх
ginnie
Дата 20.3.2009, 12:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 38
Всего: 49



AndreyCH, "бросилось в глаза", не значит, что "все плохо"  smile Код правильный, но я бы написал его так:

Код

sub new {
    my $classname = shift;
    my $self = {
        TAGNAME => 'RootXML',
        SUBXML  => [],
    };
    bless( $self, $classname );
    return $self;
}





--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
AndreyCH
Дата 20.3.2009, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 24.9.2007

Репутация: нет
Всего: нет



gcc, сначала о предложенном коде... Я правда не очень понял зачем делать именно так... Хэш я не использую потому что на одном "уровне" может присутствовать n одинаковых тэгов.
Отвечу про С++ и Java. Они ни сложнее ни проще. Они другие. smile Хотя бы то, что Перл - язык с динамической типизацией и "скриптовый". А гибкость интерфейса? А TMTOWTDI? smile Потому крышу-то и сносит! 
ginnie, да я в общем-то так и понял. smile Наглядность и правда лучше.
Напишу до конца что хотел сдалать и выложу сюда на критику. Может еще что подправить нужно?
PM   Вверх
KSURi
Дата 20.3.2009, 14:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 887
Регистрация: 8.6.2006
Где: Russia

Репутация: 20
Всего: 27



Цитата(gcc @  20.3.2009,  03:40 Найти цитируемый пост)
ну так и что из этого "что он для того, чтобы избавиться от написания однообразных методов типа"? 

Совершенно бессмысленный вопрос. Не вижу смысла продолжать в данном топике.


--------------------
Died at Life.pl line 21
PM Jabber   Вверх
AndreyCH
Дата 3.4.2009, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 24.9.2007

Репутация: нет
Всего: нет



Народ, с вашего позволения задам еще пару вопросов!

Код

my $pr0 = $MyClass0->new();
my $pr1 = $MyClass1->new();

my @arr = [];
$arr[0] = $pr0;
$arr[1] = $pr1; 



Так вот тут мы видим пару классов (объектов). Как мне последовательно перебирая массив понимать объект какого типа сейчас в этой ячейке?
Хотелось бы услышать Ваши варианты решения (свое решение не привожу, дабы не подталкивать...) smile

Это сообщение отредактировал(а) AndreyCH - 3.4.2009, 15:39
PM   Вверх
gcc
Дата 3.4.2009, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 2691
Регистрация: 25.4.2008
Где: %&й

Репутация: 1
Всего: 17



Цитата(AndreyCH @ 3.4.2009,  15:39)
 Как мне последовательно перебирая массив понимать объект какого типа сейчас в этой ячейке?

http://search.cpan.org/~gbarr/Scalar-List-.../Scalar/Util.pm

reftype EXPR

Добавлено через 2 минуты и 32 секунды
Код

f (ref($z) eq 'ARRAY')
                        {
        #print "z-ARRAY ref!\n";
                        push @b, 0; push @b, 'a';
                        }
                elsif (ref($z) eq 'HASH')
                        {
                        push @b, 0; push @b, 'h';
        #print "z-HASH ref!\n";
                        }
                elsif (ref($z) eq 'REF' || ref($z) eq 'SCALAR')
                        {
                        push @b, 0; push @b, 's';
        #print "z-SCALAR ref!\n";
                        }
                #if (ref($z) eq 'SCALAR') {push @b, 0; push @b, 'a';}

                }

PM WWW ICQ Skype GTalk Jabber   Вверх
KSURi
Дата 3.4.2009, 17:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 887
Регистрация: 8.6.2006
Где: Russia

Репутация: 20
Всего: 27



Цитата(AndreyCH @  3.4.2009,  15:39 Найти цитируемый пост)
my @arr = [];

Не по теме, но все же) Должно быть (), иначе у вас получается массив из одного элемента - ссылки на другой анонимный массив.

Вы хотите узнать именно структуру какого типа передавали в bless? Или все-таки просто имя класса объекта?
Если первое, то gcc ответил уже, а если второе (что, имхо, более вероятно), то perldoc -f ref


--------------------
Died at Life.pl line 21
PM Jabber   Вверх
AndreyCH
Дата 5.4.2009, 19:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 24.9.2007

Репутация: нет
Всего: нет



Спасибо за ответы! Все сделал как Вы написали, и все получилось! smile
Ну а для эксперимента у базового класса сделал метод getClassName() где и получаю имя класса.
Двигаюсь дальше. smile Скоро будут еще вопросы.
PM   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1304 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.