Table api - PullRequest
       30

Table api

2 голосов
/ 03 марта 2009

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

Вы делаете table.row(i).column(0).setText(students[i].surname())
или table[0][i] = students[i].surname()

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

То же самое для: table.row(0).column(0).setBackground(red)
vs: table[0][0].setBackground(red)

Обратите внимание, что Table::row возвращает Table::Row, функция column которого возвращает Table :: Cell, а Table :: Cell предоставляет setText или op= (а также setBackground).
То же самое для Table::op[] и Table::Row::op[].

Ваши мысли?

Ответы [ 6 ]

1 голос
/ 03 марта 2009

В качестве менее многословной альтернативы для многих распространенных случаев я бы также представил что-то вроде этого:

table.rowcol(i, j) = "blah"; // rowcol returns directly a cell
table.colrow(k, t).SetBackground(black);

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

0 голосов
/ 03 марта 2009

Нет пути, который лучше другого. Это зависит от того, что вы должны делать со своей структурой данных.

Тем не менее, для простого табличного виджета (при условии, что вы не кодируете сложное приложение, подобное Excel), я бы искал простой синтаксис вместо более общего интерфейса. Так что table [0] [1] = "blah" просто отлично подойдет для меня.

0 голосов
/ 03 марта 2009
table.row(i).column(0)

Этот стиль известен как Имена именованных параметров . Это позволяет легко переупорядочивать набор вызовов любым удобным для вас способом, альтернативным позиционным параметрам. Однако это работает при условии, что каждый из вызовов chained возвращает один и тот же исходный объект. Конечно, в вашем случае у вас есть объект row и объект column. Так что здесь особо нечего получить.

Простота использования второй конструкции дает еще одну вескую причину для выбора второй из них.

0 голосов
/ 03 марта 2009

Решение с методами Table :: row () и Table :: Row :: column () немного более читабельно (в общем) и позволяет однозначно создать метод Table :: column (), Table :: Класс Column (proxy) и метод Table :: Column :: row () позже, если это когда-либо понадобится. Это решение также позволяет легко находить все места, где есть доступ к строкам / столбцам, что намного сложнее, если вы используете перегрузку операторов.

Однако, как отмечали другие, второе решение менее типично и, на мой взгляд, не намного хуже в читаемости. (Может даже быть более читабельным в определенных ситуациях.)

Вам решать, хотя, я просто даю некоторые последствия обоих решений: -)

0 голосов
/ 03 марта 2009

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

if(table.rows > 0)
{
    var row = table.row[0];
    if(row.columns > 0)
    {
        var col = row.column[0];
        etc...
0 голосов
/ 03 марта 2009

Второй. Он несет в себе столько же смысла, как и первый, и его намного легче читать и печатать (я не совсем понимаю, почему вы говорите, что это «гораздо менее разумно».)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...