Re[2]: Пропертя
От: Abyx Россия  
Дата: 04.05.12 16:34
Оценка:
Здравствуйте, Vamp, Вы писали:

другой пример где проперти нужны:

разбираемся в legacy коде, имеем код

struct Foo
{
    int state;
};


пишем

struct Foo
{
    __declspec(property(get=get_state, put=set_state)) int state;
    int m_state;
    int get_state() const { return m_state; }   
    void set_state(int newState)
    {
       if (m_state == X)
           assert(newState != Y);

       m_state = newState;
    }
};


компилируем, запускаем автоматические тесты, узнаем что-то новое о коде

(я очень сомневаюсь что бывают такие хитрые точки останова в отладчике, поправьте меня если это не так)
In Zen We Trust
Re[6]: Пропертя
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 04.05.12 16:40
Оценка:
Здравствуйте, jazzer, Вы писали:

V>>>Во-вторых, я в своей жизни повидал аксессоров (и нахлебался с ними) — и ни разу еще не видел, чтобы они реализовывали эти самые "сайд-эффекты". Тупое присваивание.

К>>А как именно нахлебался?
J>Геморрой с изменением:
J>1. Операторы использовать нельзя (прощайте ++, +=, >> и т.д.).

Тут есть два выхода. Можно разрешить любые неописанные операции через get-modify-set, а можно какие-то операции явно определить с реализующим их кодом, а не только get и set. Можно использовать оба.

J>2. Функции и функции-члены использовать нельзя (прощайте resize(), reserve(), sort() и т.д.).


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

  property foo {
    void resize(size_t newsize) { this->resize_foo(newsize); }
  };


спокойно бы закрыл эту проблему, позволив определять методы для свойств как алиасы для методов класса-хозяина.

J>3. Всегда надо заводить лишний объект.

J>4. Всё делается только через присваивание этого лишнего объекта, которое крайне редко может сравниться по оптимальности с прямой работой с объектом.

Эти пункты являются следствием нерешённости пунктов 1 и 2. Если их решить, этих проблем не будет.

J>5. Даже в случае тривиальных геттеров-сеттеров компилятор не будет достаточно умным, чтобы переписать код изменения третьего объекта на прямую работу с объектом-членом.


Компиляторы сейчас умеют и значительно более умные вещи, а эта будет для них тривиальщиной.
The God is real, unless declared integer.
Re: КЫВТ GUI—надо быть проще
От: MasterZiv СССР  
Дата: 04.05.12 17:25
Оценка: +3 -1
K>почему ни в одном стандарте с++ до сих пор не предложили нормальные пропертя?


Отвечу коротко и надеюсь ясно: потому что нахрен они никому не нужны.

K>разве не лучше писать Core->SystemA->Manager->Call();

K>чем GetCore()->GetSystemA()->GetManager()->Call();
K>?

Это детская болезнь.
не чеши — пойдет.
кывт уг
Re: Пропертя
От: IROV..  
Дата: 04.05.12 17:27
Оценка: +2 -3
Здравствуйте, Kingofastellarwar, Вы писали:

K>почему ни в одном стандарте с++ до сих пор не предложили нормальные пропертя?

Потомучто это удел скриптов

K>разве не лучше писать Core->SystemA->Manager->Call();

K>чем GetCore()->GetSystemA()->GetManager()->Call();
K>?
Писать несколько гетов в одной строчке? у вас гавно-архитектура, отсюда все эти выдуманые проблемы.

K>я из за этого уродства забил на изоляцию мемберов от внешнего мира и использую паблик мемберы по полной.

Перейди на скрипты, С++ для тебя противопоказан. Даже С для тебя будет противопоказан.

K>почему в 11-м стандарте предложена куча всякой ультраспецифичной лабуды, а такого ништяка до сих пор там нет?

В 11 стандарте нет концептов, вот это действительно беда — а проперти это паталогия скриптеров

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

например setPosition, getMatrix
setPosition выставит флаг инвалидации
getMatrix пересчитает матрицу только в том случае если данные изменились, в противном вернет as is
я не волшебник, я только учусь!
Re[2]: КЫВТ GUI—надо быть проще
От: о_О
Дата: 04.05.12 17:37
Оценка: +1
Здравствуйте, MasterZiv, Вы писали:

MZ>потому что нахрен они никому не нужны.

в дотнете нужны.

MZ>КЫВТ УГ

возвращайся на исходнечки.ру
Re[4]: Пропертя
От: о_О
Дата: 04.05.12 17:41
Оценка: +1
Здравствуйте, jazzer, Вы писали:

J>И как, часто в твоей жизни наступало такое вот "завтра"? Только честно.

J>У меня вот чуть чаще чем никогда.

возникает постоянно при проектировании с нуля, из-за неопытности не всегда получается сделать сразу хорошо. абстрагировался, а там хоть потоп
Re[7]: Пропертя
От: jazzer Россия Skype: enerjazzer
Дата: 04.05.12 18:44
Оценка:
Здравствуйте, netch80, Вы писали:

N>Здравствуйте, jazzer, Вы писали:


V>>>>Во-вторых, я в своей жизни повидал аксессоров (и нахлебался с ними) — и ни разу еще не видел, чтобы они реализовывали эти самые "сайд-эффекты". Тупое присваивание.

К>>>А как именно нахлебался?
J>>Геморрой с изменением:
J>>1. Операторы использовать нельзя (прощайте ++, +=, >> и т.д.).

N>Тут есть два выхода. Можно разрешить любые неописанные операции через get-modify-set, а можно какие-то операции явно определить с реализующим их кодом, а не только get и set. Можно использовать оба.

Ага. Сколько у нас там операторов? С десяток наберется ведь?
И вся эта карусель лишь ради того, что "Вдруг Когда-то Где-то Кому-то" (tm) могут потребоваться сайд-эффекты.

J>>2. Функции и функции-члены использовать нельзя (прощайте resize(), reserve(), sort() и т.д.).


N>Именно для этого случая их вообще-то и не положено использовать. Хотя, с другой стороны, механизм, позволяющий делать что-то вроде


N>
N>  property foo {
N>    void resize(size_t newsize) { this->resize_foo(newsize); }
N>  };
N>


N>спокойно бы закрыл эту проблему, позволив определять методы для свойств как алиасы для методов класса-хозяина.

Те же проблемы, что и с операторами, только еще хуже. Это ж для всех функций-членов всех классов придется подобное писать, и для каждого свое, так что даже в макрос не упрячешь. А попробуй-ка воспроизведи интерфейс std::string, ага. Лучше сразу застрелиться.

Так что овчинка выделки не стоит совершенно.

J>>3. Всегда надо заводить лишний объект.

J>>4. Всё делается только через присваивание этого лишнего объекта, которое крайне редко может сравниться по оптимальности с прямой работой с объектом.

N>Эти пункты являются следствием нерешённости пунктов 1 и 2. Если их решить, этих проблем не будет.

Одна беда — что их решить вменяемым способом нельзя. А так оно конечно.

J>>5. Даже в случае тривиальных геттеров-сеттеров компилятор не будет достаточно умным, чтобы переписать код изменения третьего объекта на прямую работу с объектом-членом.


N>Компиляторы сейчас умеют и значительно более умные вещи, а эта будет для них тривиальщиной.

Доверяй, но проверяй.
На сцене компилятор GCC4.4.4 (нынешний стандартный RedHat-овский), с оптимизацией -О3 (в продакшен-коде пользуются оптимизацией не выше -О2, к слову).
Исходный код:
  Скрытый текст
#include <string>

// открытый класс
class A
{
public:
  int x;
  double d;
  std::string s;
};

//класс с геттерами-сеттерами
class B
{
public:
  int getX() const { return x_; }
  void setX(int x) { x_ = x; }
  
  double getD() const { return d_; }
  void setD(const double& d) { d_ = d; }
  
  std::string getS() const { return s_; }
  void setS(const std::string& s) { s_ = s; }
private:
  int x_;
  double d_;
  std::string s_;
};


// работаем с переменной типа int
void fiA(A& a)
{
  ++a.x;
}

void fiB(B& b)
{
  int x = b.getX();
  ++x;
  b.setX(x);
}


// работаем с переменной типа double
void fdA(A& a)
{
  a.d += 100;
}

void fdB(B& b)
{
  double d = b.getD();
  d += 100;
  b.setD(d);
}


// работаем с переменной типа std::string
void fsA(A& a)
{
  a.s.resize(100);
}

void fsB(B& b)
{
  std::string s = b.getS();
  s.resize(100);
  b.setS(s);
}


// введем еще один (тривиальный) уровень сеттеров-геттеров
class A0
{
public:
  A a;
};

class B0
{
public:
  B getB() const { return b_; }
  void setB(const B& b) { b_ = b; }
private:
  B b_;
};

// поехали
void fAA(A0& a0)
{
  ++a0.a.x;
  a0.a.d += 100;
  a0.a.s.resize(100);
}


void fBB(B0& b0)
{
  B b = b0.getB();
  int x = b.getX();
  ++x;
  b.setX(x);
  double d = b.getD();
  d += 100;
  b.setD(d);
  std::string s = b.getS();
  s.resize(100);
  b.setS(s);
  b0.setB(b);
}

это я еще по-божески обошелся с геттеро-сеттерным кодом — переменную создал только один раз в начале и присвоил обратно только один раз в конце.
Хотя, чтоб делать эквивалентно, надо бы звать get/set на каждый чих (потому что в промежутках могут зваться функции, которым требуется измененное состояние полного объекта).
Но и без этого читабельность кода где-то в районе плинтуса.

Дизассемблер:
  Скрытый текст
int — все хорошо
0000000000000aa0 <fiA(A&)>:
 aa0:   83 07 01                addl   $0x1,(%rdi)
 aa3:   c3                      retq
 aa4:   66 66 66 2e 0f 1f 84    nopw   %cs:0x0(%rax,%rax,1)
 aab:   00 00 00 00 00

0000000000000ab0 <fiB(B&)>:
 ab0:   83 07 01                addl   $0x1,(%rdi)
 ab3:   c3                      retq
 ab4:   66 66 66 2e 0f 1f 84    nopw   %cs:0x0(%rax,%rax,1)
 abb:   00 00 00 00 00

double — тоже всё хорошо, снимаю шляпу перед разработчиками GCC
0000000000000ac0 <fdA(A&)>:
 ac0:   f2 0f 10 47 08          movsd  0x8(%rdi),%xmm0
 ac5:   f2 0f 58 05 2b 02 00    addsd  0x22b(%rip),%xmm0        # cf8 <_fini+0x10>
 acc:   00
 acd:   f2 0f 11 47 08          movsd  %xmm0,0x8(%rdi)
 ad2:   c3                      retq
 ad3:   66 66 66 66 2e 0f 1f    nopw   %cs:0x0(%rax,%rax,1)
 ada:   84 00 00 00 00 00

0000000000000ae0 <fdB(B&)>:
 ae0:   f2 0f 10 47 08          movsd  0x8(%rdi),%xmm0
 ae5:   f2 0f 58 05 0b 02 00    addsd  0x20b(%rip),%xmm0        # cf8 <_fini+0x10>
 aec:   00
 aed:   f2 0f 11 47 08          movsd  %xmm0,0x8(%rdi)
 af2:   c3                      retq
 af3:   66 66 66 66 2e 0f 1f    nopw   %cs:0x0(%rax,%rax,1)
 afa:   84 00 00 00 00 00


std::string — туши свет
0000000000000b00 <fsA(A&)>:
 b00:   48 83 c7 10             add    $0x10,%rdi
 b04:   31 d2                   xor    %edx,%edx
 b06:   be 64 00 00 00          mov    $0x64,%esi
 b0b:   e9 90 fe ff ff          jmpq   9a0 <std::basic_string::resize(unsigned long, char)@plt>

0000000000000b30 <fsB(B&)>:
 b30:   48 89 6c 24 f8          mov    %rbp,-0x8(%rsp)
 b35:   48 8d 6f 10             lea    0x10(%rdi),%rbp
 b39:   48 89 5c 24 f0          mov    %rbx,-0x10(%rsp)
 b3e:   48 83 ec 28             sub    $0x28,%rsp
 b42:   48 89 ee                mov    %rbp,%rsi
 b45:   48 89 e7                mov    %rsp,%rdi
 b48:   e8 e3 fd ff ff          callq  930 <std::basic_string::basic_string(std::basic_string const&)@plt>
 b4d:   31 d2                   xor    %edx,%edx
 b4f:   be 64 00 00 00          mov    $0x64,%esi
 b54:   48 89 e7                mov    %rsp,%rdi
 b57:   e8 44 fe ff ff          callq  9a0 <std::basic_string::resize(unsigned long, char)@plt>
 b5c:   48 89 e6                mov    %rsp,%rsi
 b5f:   48 89 ef                mov    %rbp,%rdi
 b62:   e8 29 fe ff ff          callq  990 <std::basic_string::assign(std::basic_string const&)@plt>
 b67:   48 8b 3c 24             mov    (%rsp),%rdi
 b6b:   48 83 ef 18             sub    $0x18,%rdi
 b6f:   48 3b 3d 8a 06 20 00    cmp    0x20068a(%rip),%rdi        # 201200 <_DYNAMIC+0x1d0>
 b76:   75 0f                   jne    b87 <fsB(B&)+0x57>
 b78:   48 8b 5c 24 18          mov    0x18(%rsp),%rbx
 b7d:   48 8b 6c 24 20          mov    0x20(%rsp),%rbp
 b82:   48 83 c4 28             add    $0x28,%rsp
 b86:   c3                      retq
 b87:   48 83 3d 69 06 20 00    cmpq   $0x0,0x200669(%rip)        # 2011f8 <_DYNAMIC+0x1c8>
 b8e:   00
 b8f:   74 2b                   je     bbc <fsB(B&)+0x8c>
 b91:   83 c8 ff                or     $0xffffffffffffffff,%eax
 b94:   f0 0f c1 47 10          lock xadd %eax,0x10(%rdi)
 b99:   85 c0                   test   %eax,%eax
 b9b:   7f db                   jg     b78 <fsB(B&)+0x48>
 b9d:   48 8d 74 24 0f          lea    0xf(%rsp),%rsi
 ba2:   e8 b9 fd ff ff          callq  960 <std::basic_string::_Rep::_M_destroy(std::allocator<char> const&)@plt>
 ba7:   eb cf                   jmp    b78 <fsB(B&)+0x48>
 ba9:   48 89 c5                mov    %rax,%rbp
 bac:   48 89 e7                mov    %rsp,%rdi
 baf:   e8 9c fd ff ff          callq  950 <std::basic_string::~basic_string()@plt>
 bb4:   48 89 ef                mov    %rbp,%rdi
 bb7:   e8 04 fe ff ff          callq  9c0 <_Unwind_Resume@plt>
 bbc:   8b 47 10                mov    0x10(%rdi),%eax
 bbf:   8d 50 ff                lea    -0x1(%rax),%edx
 bc2:   89 57 10                mov    %edx,0x10(%rdi)
 bc5:   eb d2                   jmp    b99 <fsB(B&)+0x69>
 bc7:   66 0f 1f 84 00 00 00    nopw   0x0(%rax,%rax,1)
 bce:   00 00


второй (тривиальный) уровень сеттеров-геттеров — тоже туши свет
0000000000000a20 <fAA(A0&)>:
 a20:   f2 0f 10 47 08          movsd  0x8(%rdi),%xmm0
 a25:   83 07 01                addl   $0x1,(%rdi)
 a28:   31 d2                   xor    %edx,%edx
 a2a:   be 64 00 00 00          mov    $0x64,%esi
 a2f:   f2 0f 58 05 61 02 00    addsd  0x261(%rip),%xmm0        # c98 <_fini+0x10>
 a36:   00
 a37:   f2 0f 11 47 08          movsd  %xmm0,0x8(%rdi)
 a3c:   48 83 c7 10             add    $0x10,%rdi
 a40:   e9 7b fe ff ff          jmpq   8c0 <std::basic_string::resize(unsigned long, char)@plt>
 a45:   66 66 2e 0f 1f 84 00    nopw   %cs:0x0(%rax,%rax,1)
 a4c:   00 00 00 00


0000000000000af0 <fBB(B0&)>:
 af0:   48 89 5c 24 d8          mov    %rbx,-0x28(%rsp)
 af5:   48 89 6c 24 e0          mov    %rbp,-0x20(%rsp)
 afa:   48 89 fb                mov    %rdi,%rbx
 afd:   4c 89 64 24 e8          mov    %r12,-0x18(%rsp)
 b02:   4c 89 6c 24 f0          mov    %r13,-0x10(%rsp)
 b07:   4c 8d 6f 10             lea    0x10(%rdi),%r13
 b0b:   4c 89 74 24 f8          mov    %r14,-0x8(%rsp)
 b10:   48 83 ec 58             sub    $0x58,%rsp
 b14:   8b 07                   mov    (%rdi),%eax
 b16:   4c 8d 74 24 10          lea    0x10(%rsp),%r14
 b1b:   4c 89 ee                mov    %r13,%rsi
 b1e:   4c 8d 64 24 20          lea    0x20(%rsp),%r12
 b23:   48 89 e5                mov    %rsp,%rbp
 b26:   89 04 24                mov    %eax,(%rsp)
 b29:   48 8b 47 08             mov    0x8(%rdi),%rax
 b2d:   4c 89 f7                mov    %r14,%rdi
 b30:   48 89 44 24 08          mov    %rax,0x8(%rsp)
 b35:   e8 36 fd ff ff          callq  870 <std::basic_string::basic_string(std::basic_string const&)@plt>
 b3a:   f2 0f 10 44 24 08       movsd  0x8(%rsp),%xmm0
 b40:   4c 89 f6                mov    %r14,%rsi
 b43:   4c 89 e7                mov    %r12,%rdi
 b46:   83 04 24 01             addl   $0x1,(%rsp)
 b4a:   f2 0f 58 05 46 01 00    addsd  0x146(%rip),%xmm0        # c98 <_fini+0x10>
 b51:   00
 b52:   f2 0f 11 44 24 08       movsd  %xmm0,0x8(%rsp)
 b58:   e8 13 fd ff ff          callq  870 <std::basic_string::basic_string(std::basic_string const&)@plt>
 b5d:   31 d2                   xor    %edx,%edx
 b5f:   be 64 00 00 00          mov    $0x64,%esi
 b64:   4c 89 e7                mov    %r12,%rdi
 b67:   e8 54 fd ff ff          callq  8c0 <std::basic_string::resize(unsigned long, char)@plt>
 b6c:   4c 89 f7                mov    %r14,%rdi
 b6f:   4c 89 e6                mov    %r12,%rsi
 b72:   e8 39 fd ff ff          callq  8b0 <std::basic_string::assign(std::basic_string const&)@plt>
 b77:   8b 04 24                mov    (%rsp),%eax
 b7a:   4c 89 f6                mov    %r14,%rsi
 b7d:   4c 89 ef                mov    %r13,%rdi
 b80:   89 03                   mov    %eax,(%rbx)
 b82:   48 8b 44 24 08          mov    0x8(%rsp),%rax
 b87:   48 89 43 08             mov    %rax,0x8(%rbx)
 b8b:   e8 20 fd ff ff          callq  8b0 <std::basic_string::assign(std::basic_string const&)@plt>
 b90:   48 8b 7c 24 20          mov    0x20(%rsp),%rdi
 b95:   48 8b 1d 64 06 20 00    mov    0x200664(%rip),%rbx        # 201200 <_DYNAMIC+0x1d0>
 b9c:   48 83 ef 18             sub    $0x18,%rdi
 ba0:   48 39 df                cmp    %rbx,%rdi
 ba3:   75 2c                   jne    bd1 <fBB(B0&)+0xe1>
 ba5:   48 8b 7c 24 10          mov    0x10(%rsp),%rdi
 baa:   48 83 ef 18             sub    $0x18,%rdi
 bae:   48 39 fb                cmp    %rdi,%rbx
 bb1:   75 40                   jne    bf3 <fBB(B0&)+0x103>
 bb3:   48 8b 5c 24 30          mov    0x30(%rsp),%rbx
 bb8:   48 8b 6c 24 38          mov    0x38(%rsp),%rbp
 bbd:   4c 8b 64 24 40          mov    0x40(%rsp),%r12
 bc2:   4c 8b 6c 24 48          mov    0x48(%rsp),%r13
 bc7:   4c 8b 74 24 50          mov    0x50(%rsp),%r14
 bcc:   48 83 c4 58             add    $0x58,%rsp
 bd0:   c3                      retq
 bd1:   48 83 3d 1f 06 20 00    cmpq   $0x0,0x20061f(%rip)        # 2011f8 <_DYNAMIC+0x1c8>
 bd8:   00
 bd9:   74 66                   je     c41 <fBB(B0&)+0x151>
 bdb:   83 c8 ff                or     $0xffffffffffffffff,%eax
 bde:   f0 0f c1 47 10          lock xadd %eax,0x10(%rdi)
 be3:   85 c0                   test   %eax,%eax
 be5:   7f be                   jg     ba5 <fBB(B0&)+0xb5>
 be7:   48 8d 74 24 2f          lea    0x2f(%rsp),%rsi
 bec:   e8 9f fc ff ff          callq  890 <std::basic_string::_Rep::_M_destroy(std::allocator<char> const&)@plt>
 bf1:   eb b2                   jmp    ba5 <fBB(B0&)+0xb5>
 bf3:   48 83 3d fd 05 20 00    cmpq   $0x0,0x2005fd(%rip)        # 2011f8 <_DYNAMIC+0x1c8>
 bfa:   00
 bfb:   74 34                   je     c31 <fBB(B0&)+0x141>
 bfd:   83 c8 ff                or     $0xffffffffffffffff,%eax
 c00:   f0 0f c1 47 10          lock xadd %eax,0x10(%rdi)
 c05:   85 c0                   test   %eax,%eax
 c07:   7f aa                   jg     bb3 <fBB(B0&)+0xc3>
 c09:   48 8d 74 24 2e          lea    0x2e(%rsp),%rsi
 c0e:   e8 7d fc ff ff          callq  890 <std::basic_string::_Rep::_M_destroy(std::allocator<char> const&)@plt>
 c13:   eb 9e                   jmp    bb3 <fBB(B0&)+0xc3>
 c15:   4c 89 e7                mov    %r12,%rdi
 c18:   48 89 c3                mov    %rax,%rbx
 c1b:   e8 60 fc ff ff          callq  880 <std::basic_string::~basic_string()@plt>
 c20:   48 8d 7d 10             lea    0x10(%rbp),%rdi
 c24:   e8 57 fc ff ff          callq  880 <std::basic_string::~basic_string()@plt>
 c29:   48 89 df                mov    %rbx,%rdi
 c2c:   e8 9f fc ff ff          callq  8d0 <_Unwind_Resume@plt>
 c31:   8b 47 10                mov    0x10(%rdi),%eax
 c34:   8d 50 ff                lea    -0x1(%rax),%edx
 c37:   89 57 10                mov    %edx,0x10(%rdi)
 c3a:   eb c9                   jmp    c05 <fBB(B0&)+0x115>
 c3c:   48 89 c3                mov    %rax,%rbx
 c3f:   eb df                   jmp    c20 <fBB(B0&)+0x130>
 c41:   8b 47 10                mov    0x10(%rdi),%eax
 c44:   8d 50 ff                lea    -0x1(%rax),%edx
 c47:   89 57 10                mov    %edx,0x10(%rdi)
 c4a:   eb 97                   jmp    be3 <fBB(B0&)+0xf3>

к слову, std::string используется из поставки компилятора, а не какой-нть из STLPort с оптимизацией коротких строк, который компилятор не сможет соптимизировать с вероятностью 99.94%.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[5]: Пропертя
От: jazzer Россия Skype: enerjazzer
Дата: 04.05.12 18:52
Оценка:
Здравствуйте, о_О, Вы писали:

о_О>Здравствуйте, jazzer, Вы писали:


J>>И как, часто в твоей жизни наступало такое вот "завтра"? Только честно.

J>>У меня вот чуть чаще чем никогда.

о_О>возникает постоянно при проектировании с нуля, из-за неопытности не всегда получается сделать сразу хорошо. абстрагировался, а там хоть потоп


При проектировании c нуля всегда получается не очень хорошо, поэтому первый вариант называется прототипом и выбрасывается на свалку, а в пользование идет второй, а то и третий, в котором недостатки первого устранены. И неопытность тут совершенно ни при чем — предусмотреть все с самого начала невозможно в принципе. А абстрагировать неудачный первый вариант и потом за фасадом сложных геттеров-сеттеров пытаться перерефакторить все к нормальному виду — путь к тому самому потопу.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[3]: КЫВТ GUI—надо быть проще
От: MasterZiv СССР  
Дата: 04.05.12 19:06
Оценка:
> MZ>потому что нахрен они никому не нужны.
> в дотнете нужны.

Ну, против дотнета никто не спорит. Пусть они там будут нужны.

>

> MZ>КЫВТ УГ
> возвращайся на исходнечки.ру

А это оно само пишет. Я ОДИН раз это написал, оно теперь САМО это посылаяет
Это если через Web писать. Так что все вопросы к программистам RSDN.
Posted via RSDN NNTP Server 2.1 beta
Re[8]: Пропертя
От: Ops Россия  
Дата: 04.05.12 19:19
Оценка:
Здравствуйте, jazzer, Вы писали:

J>И вся эта карусель лишь ради того, что "Вдруг Когда-то Где-то Кому-то" (tm) могут потребоваться сайд-эффекты.


Да кто ж заставляет-то? Весь разговор пошел с заявления, что геттеры-сеттеры вообще не нужны. Но ведь их вполне можно использовать, когда они облегчают жизнь, а не лепить везде, где не попадя.
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Re[9]: Пропертя
От: jazzer Россия Skype: enerjazzer
Дата: 04.05.12 19:43
Оценка:
Здравствуйте, Ops, Вы писали:

Ops>Здравствуйте, jazzer, Вы писали:


J>>И вся эта карусель лишь ради того, что "Вдруг Когда-то Где-то Кому-то" (tm) могут потребоваться сайд-эффекты.


Ops>Да кто ж заставляет-то? Весь разговор пошел с заявления, что геттеры-сеттеры вообще не нужны. Но ведь их вполне можно использовать, когда они облегчают жизнь, а не лепить везде, где не попадя.


не просто геттеры-сеттеры, а "пропертя" и их реализация через геттеры-сеттеры как альтернатива простым публичным членам.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[4]: КЫВТ GUI—надо быть проще
От: jazzer Россия Skype: enerjazzer
Дата: 04.05.12 19:46
Оценка:
Здравствуйте, MasterZiv, Вы писали:

>> MZ>КЫВТ УГ

>> возвращайся на исходнечки.ру

MZ>А это оно само пишет. Я ОДИН раз это написал, оно теперь САМО это посылаяет

MZ>Это если через Web писать. Так что все вопросы к программистам RSDN.

Я думаю, что все вопросы к твоей настройке твоего браузера, который один раз запомнил содержимое полей формы и теперь все время одно и то же туда лепит.
У меня FF, никаких "автозаполнятелей" форм нету — полет нормальный.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[5]: КЫВТ GUI— лирическое отступление.
От: MasterZiv СССР  
Дата: 04.05.12 20:01
Оценка:
> Я думаю, что все вопросы к твоей настройке твоего браузера, который один раз
> запомнил содержимое полей формы и теперь все время одно и то же туда лепит.

Безусловно. Только как их поменять я лично не имею ни малейшего представления.
А удалить их из этих полей не имею возможности -- они там все слепляются
на телефоне в такую кашу, что я имею возможность ткнуть только в ОДНО
поле, самое большое -- собственно текст сообщения, набрать его там, и потом
нажать "послать".

Я об этом всём писал в отдельном топике, но народ с RSDN-а и его Web-морды
прётся, и ничего слышать не хочет.
Posted via RSDN NNTP Server 2.1 beta
Re[10]: Пропертя
От: Ops Россия  
Дата: 04.05.12 20:13
Оценка:
Здравствуйте, jazzer, Вы писали:

J>не просто геттеры-сеттеры, а "пропертя" и их реализация через геттеры-сеттеры как альтернатива простым публичным членам.

Имена функций (любых, членов и свободных) должны сводиться к ГЛАГОЛУ — этот глагол не должен быть set или get. А когда я вижу аксессоры, я хватаюсь за пистолет.

http://www.rsdn.ru/forum/cpp/4725651.1.aspx
Автор: Vamp
Дата: 04.05.12
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Re[11]: Пропертя
От: Vamp Россия  
Дата: 04.05.12 20:20
Оценка: +1

Ops>Имена функций (любых, членов и свободных) должны сводиться к ГЛАГОЛУ — этот глагол не должен быть set или get. А когда я вижу аксессоры, я хватаюсь за пистолет.

Ops>http://www.rsdn.ru/forum/cpp/4725651.1.aspx
Автор: Vamp
Дата: 04.05.12


Классика. "Было бы ошибкой думать."
Да здравствует мыло душистое и веревка пушистая.
Re[2]: Пропертя
От: Kingofastellarwar Украина  
Дата: 04.05.12 20:43
Оценка:
Здравствуйте, IROV.., Вы писали:

IRO>Если по существу, то проектируются всегда от интерфейсов

IRO>любое изменение таких данных влечет за собой измененние состояния,
IRO>как минимум выставить флаг инвалидации, и в get она проверяется (так называемая линивый пересчет)

IRO>например setPosition, getMatrix

IRO>setPosition выставит флаг инвалидации
IRO>getMatrix пересчитает матрицу только в том случае если данные изменились, в противном вернет as is

ну и я про это, я просто не хочу писать то, что и так очевидно: set, get и эти, мать их, скобочки.

так я не против изоляции, но я ее намеренно нарушаю потому что меня раздражает писать гет, сет, скобочку сюда, скобочку туда
не тока потому что я не люблю писть то что и так очевидно, а еще потому что этот хлам мешает читать код
Я изъездил эту страну вдоль и поперек, общался с умнейшими людьми и я могу вам ручаться в том, что обработка данных является лишь причудой, мода на которую продержится не более года. (с) Эксперт, авторитет и профессионал из 1957 г.
Re[4]: КЫВТ GUI—надо быть проще
От: о_О
Дата: 04.05.12 21:01
Оценка:
Здравствуйте, MasterZiv, Вы писали:

MZ>А это оно само пишет. Я ОДИН раз это написал, оно теперь САМО это посылаяет

MZ>Это если через Web писать. Так что все вопросы к программистам RSDN.

ах, да...
пообщайся с одминистрацией через почту
Re[12]: Пропертя
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 05.05.12 05:43
Оценка:
Здравствуйте, Vamp, Вы писали:

V>

Ops>>Имена функций (любых, членов и свободных) должны сводиться к ГЛАГОЛУ — этот глагол не должен быть set или get. А когда я вижу аксессоры, я хватаюсь за пистолет.

Ops>>http://www.rsdn.ru/forum/cpp/4725651.1.aspx
Автор: Vamp
Дата: 04.05.12


V>Классика. "Было бы ошибкой думать."


Коллега, не портьте цитату. "Было бы *величайшей* ошибкой думать."
The God is real, unless declared integer.
Re[8]: Пропертя
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 05.05.12 06:02
Оценка:
Здравствуйте, jazzer, Вы писали:

N>>Тут есть два выхода. Можно разрешить любые неописанные операции через get-modify-set, а можно какие-то операции явно определить с реализующим их кодом, а не только get и set. Можно использовать оба.

J>Ага. Сколько у нас там операторов? С десяток наберется ведь?

Ну вообще-то больше, а что?

J>И вся эта карусель лишь ради того, что "Вдруг Когда-то Где-то Кому-то" (tm) могут потребоваться сайд-эффекты.


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

N>> property foo {

N>> void resize(size_t newsize) { this->resize_foo(newsize); }
N>> };
J>Те же проблемы, что и с операторами, только еще хуже. Это ж для всех функций-членов всех классов придется подобное писать, и для каждого свое, так что даже в макрос не упрячешь.

Почему *придётся*? Это пишется только там, где оно такое действительно запрошено. Никто не мешает совмещать этот механизм и с открытыми членами, и с геттерами, где надо.

J>Так что овчинка выделки не стоит совершенно.


В варианте, доведённом до абсурда — да, не стоит. В нормальном — не доказано.

<...>
J>std::string — туши свет

Конечно, это уже за пределами их понимания, потому что ты делаешь везде копии и не подсказал компилятору никакой оптимизации.
(С другой стороны, вполне возможно, оптимизации тут есть в реализации, за счёт сохранения общего буфера строки и COW на модификации. Поэтому остаются только несколько вызовов функций, которые относительно дёшевы. Но это за пределами темы properties.)

J>// введем еще один (тривиальный) уровень сеттеров-геттеров


И тут, когда не добрались до std::string, проблем нет — всё аккуратно вычитывается напрямую по смещениям и не создаются никакие getB().

J>к слову, std::string используется из поставки компилятора, а не какой-нть из STLPort с оптимизацией коротких строк, который компилятор не сможет соптимизировать с вероятностью 99.94%.


Я не изучал разницу, но не вижу тут принципиальной проблемы. std::string сам по себе достаточно сложный зверь. Никто не обещал тотального упрощения всего и везде. Но вот сделать удобный для человека сахар для важного случая — почему бы и нет?
The God is real, unless declared integer.
Re[12]: Пропертя
От: Ops Россия  
Дата: 05.05.12 07:17
Оценка:
Здравствуйте, Vamp, Вы писали:

V>

Ops>>Имена функций (любых, членов и свободных) должны сводиться к ГЛАГОЛУ — этот глагол не должен быть set или get. А когда я вижу аксессоры, я хватаюсь за пистолет.

Ops>>http://www.rsdn.ru/forum/cpp/4725651.1.aspx
Автор: Vamp
Дата: 04.05.12


V>Классика. "Было бы ошибкой думать."

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