LINUX.ORG.RU

Планы по выпуску GTK+ версии 3

 


1

0

В списке рассылки gtk-devel-list обсуждаются планы выпуска GTK+ версии 3. Основные подготовительные действия, которые необходимо предпринять в текущей ветке:

  • Спрятать все открытые поля структур с помощью макроса GSEAL(). В случае необходимости предоставить новые методы доступа к этим полям. Также должны быть скрыты поля-указатели "priv" на структуры, содержащие закрытые данные. Эти действия уже практически полностью проведены в репозитории git://git.imendio.com/projects/gtk+.git
  • Реализовать закрытые члены класса, что включает изменения в коде GType.
  • Объявить как deprecated публичные данные класса с помощью макроса GSEAL().
  • Поскольку не останется простого способа для доступа к полям класса, а использование g_object_[sg]et() утомительно, необходимо ввести новые методы доступа, вроде g_object_get_int(), *double(), *string() и т.д.
  • Существует множество макросов, таких как GTK_WIDGET_GET_FLAGS(), которые всегда были причиной многочисленных проблем (см. bug #69872). Необходимо реализовать нормальные методы доступа (в виде функций) и избавиться от этих макросов.
  • GtkStyle, без сомнений, самый сложный тип, нуждающийся в скрытии публичных полей, и до релиза должно быть проведено множество исследований.
  • Избавиться от всего кода, объявленного deprecated в 2.x. Это подразумевает все соответствующие виджеты и функции.
  • Удалить все поля структур из публичного API. Есть два способа достичь этого:
    a) переместить все структуры в закрытые заголовки;
    b) переместить структуры в C-файл реализации, но тогда всей библиотеке придётся использовать соответствующие методы доступа.
    Эти варианты ещё обсуждаются.
  • Отключить deprecated-код по умолчанию во флагах компиляции.
Таким образом, версия 3.0 будет готова к релизу. Все приложения, которые собираются для ветки 2.x с макросом GSEAL() и не используют deprecated-кода, будут без проблем собираться для ветки 3.x. Наверное, таким образом разработчики пытаются избежать кошмара миграции, который можно видеть на примере библиотеки Qt.

>>> Подробности

★★★★

Проверено: JB ()
Ответ на: комментарий от anonymous

я против С ничего не имею, реализовали, работает - что еще надо? значит молодцы

lester ★★★★
()
Ответ на: комментарий от svu

>языку, имеющему наглость называть себя

ROFL =D

anonymous
()
Ответ на: комментарий от svu

> более-менее приличных вещей

мое ИМХО - использование вещей из IsKindOf, ClassByName и т.п. это плохо, это и есть костыли - причем в тексте программы( точнее в проектировании модели программы и необходимых классов/интерфейсов ), а не в самом языке, именно в этих местах скорее всего и проявятся лажи при расширении кода программы, так что называть это "приличными вещами" я бы не стал

lester ★★★★
()
Ответ на: комментарий от alex_custov

>Вижуал ?

Ну вообще, по стандарту он должен отвалиться в "неоднозначностью", т.к есть неявная конверсия int->double.

Absurd ★★★
()
Ответ на: комментарий от lester

И как ты без IsKindOf реализуешь динамическую диспетчеризацию по двум аргументам? Визиторы городить будешь на каждый чих?

anonymous
()
Ответ на: комментарий от svu

> В принципе, все это можно делать и на С.

Ещё б это нельзя было сделать на Тьюринг-полном языке :)

Вопрос в удобстве и только в нём. Риторический вопрос: удобен ли GObject?

gaa ★★
()
Ответ на: комментарий от lester

> это плохо

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

svu ★★★★★
()
Ответ на: комментарий от svu

>В ОО языках это именно так "надо или нет - оно будет использоваться". На то они и ОО.

Обычно ОО-средствами языка страраются решить поставленную задачу, а то, что вы имеете ввиду под ОО ("надо или нет - оно будет использоваться") - фетишизм

>А когда ОО "как бы" (кагбэ?) есть, но приходится городить огороды для более-менее приличных вещей...

Какая степень необходимости использования этих "более-менее приличных вещей" по отношению к имеющимся возможностям С++?

anonymous
()
Ответ на: комментарий от anonymous

может я не так понял вопрос, но как по мне использование интерфейсов и виртуальных функций вполне решает эту задачу

lester ★★★★
()
Ответ на: комментарий от anonymous

> Ну и в сях вон ООП нагородили. Тоже типа рабочее решение.

Вопрос в количестве костылей.

tailgunner ★★★★★
()
Ответ на: комментарий от gaa

Вполне удобен. Вопрос привычки;)

Нет, вопрос не в удобстве. Удобство субъективно. А вот тот факт, что плюсы являются ОО только на момент компиляции - это объективно. Как и все вытекающие из этого следствия по недостаточной функциональности в том, что касается ОО.

svu ★★★★★
()
Ответ на: комментарий от svu

в принципе да, но тут есть простое решение - опять же введение интерфейса( а он в принципе необходим 100% в таком случае ), через который можно получить идентификатор полученного обьекта, в принципе я так в плагинах всегда делаю, я как то и забыл про это :) но опять же это очень легко реализуется в случае необходимости, именно там где оно нужно - а нужно оно таки не так часто

lester ★★★★
()
Ответ на: комментарий от lester

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

Представьте себе, что Вы пишете application server на плюсах. Сами applications доступны в виде .so модулей. Дальше Вы его грузите. Дальше Вы получаете ссылку на EJB, ой, главный объект "приложения". И начинаете выяснять, что он умеет-может... Вам придется строить свой собственный ОО, создавая "рефлексию вручную".

svu ★★★★★
()
Ответ на: комментарий от lester

Да, это все возможно. Но то, что это Вам придется делать САМОМУ - говорит о качестве ОО в плюсах.

svu ★★★★★
()
Ответ на: комментарий от Absurd

>>Ну вообще, по стандарту он должен отвалиться в "неоднозначностью", т.к есть неявная конверсия int->double.

У тебя каша в голове. man method overloading

alex_custov ★★★★★
()
Ответ на: комментарий от svu

interface I_Application
{
public: //////////////////////////////////////////////
bool CanSomething( void ) = 0;
bool CanSomethingElse( void ) = 0;
...

public: //////////////////////////////////////////////
void DoSomething( ... ) = 0;
...

public: //////////////////////////////////////////////
menu* GetObjectMenu( object* inObject );
void PrefsDialog( ... ) = 0;
void Run( ... ) = 0;
...
};

?


написать Imp, а потом наследоваться от него, насчет "что он умеет-может" - все это должно быть определено еще во время разработки этого интерфейса, а потом в случае надобности его можно расширять, все остальное создает неразбериху в коде и программе

lester ★★★★
()
Ответ на: комментарий от svu

> Нет, вопрос не в удобстве. Удобство субъективно.

Да вот что-то с удобного-разудобного "C с ООП" разработчики с радостью перескакивают на python или mono. Может у них нет необходиомсти в такой привычке?

> А вот тот факт, что плюсы являются ОО только на момент компиляции - это объективно.

Не перескакивайте с темы на тему.

gaa ★★
()
Ответ на: комментарий от alex_custov

>>Ну вообще, по стандарту он должен отвалиться в "неоднозначностью", т.к есть неявная конверсия int->double.

>У тебя каша в голове. man method overloading

man Sutter 2005. И man Stroustrup "C++ - Эволюция и дизайн" ("Как я рожал ёжиков").

Absurd ★★★
()
Ответ на: комментарий от svu

> Дальше Вы получаете ссылку на EJB, ой, главный объект "приложения". И начинаете выяснять, что он умеет-может... Вам придется строить свой собственный ОО, создавая "рефлексию вручную".

Вроде никто и не говорит, что в плюсах рефлексия есть.

Да, для подгрузки классов из плагинов C++ не подходит. И? У него от этого сразу отсыхает ОО?

gaa ★★
()
Ответ на: комментарий от gaa

>> Это тот случай когда "надо".

>И в итоге проект намертво завязнет в GOjbect. Прелестно!

За завязывание на бусте и std:: надо вообще как минимум расстреливать.

Absurd ★★★
()
Ответ на: комментарий от gaa

> Может у них нет необходиомсти в такой привычке?

Безусловно, гораздо проще использовать языки, где ОО не на уровне макросов-библиотек. Глупо с этим спорить. Но не языки, где ОО на уровне языка, но сделано криво-косо.

svu ★★★★★
()
Ответ на: комментарий от Absurd

>> И в итоге проект намертво завязнет в GOjbect. Прелестно!

> За завязывание на бусте и std:: надо вообще как минимум расстреливать.

Пройди к психиатру на лечение плюсофобии.

gaa ★★
()
Ответ на: комментарий от svu

я и не утверждаю, что ОО в с++ реализвано на "100%", давайте подытожим: оно таки там есть, многим этого вполне хватает, реализовать и положить в отдельные либы( любой язык общего профиля ничто без расширений ) недостающие фичи можно, зато можно без надобности ими не пользоваться - далеко не все задачи выполняюятся мгновенно и экономию процессорного времени/процессора никто не отменял, все кому это не равится должны спокойно использовать Ъ ОО языки и не мучаться, есть претензии к этим утверждениям? :)

lester ★★★★
()
Ответ на: комментарий от gaa

> И? У него от этого сразу отсыхает ОО?

Картинка с плагинами демонстрирует костыльность ОО в плюсах.

Еще раз: ОО времени компиляции является костылем. Настоящий ОО в языке возможен только через полноценную поддержку в рантайме, включая как минимум рефлексию (а лучше - MOP, в смысле read/write).

svu ★★★★★
()
Ответ на: комментарий от svu

> Что такое "намертво завязнет"? Да, gobject будет в зависимостях. И что?

А то, что придётся учить этот "ооп на ц" дабы не словить где-нибудь проблем из-за путаницы его классов с классами C++, на каждое преобразование строки навешать по врапперу...

Я уж не говорю про отвратную документацию этого libxml++, которую надо смотреть, параллельно влезая в доки по libxml.

gaa ★★
()
Ответ на: комментарий от svu

> Картинка с плагинами демонстрирует костыльность ОО в плюсах.

Демонстрирует непредназначенность плюсов к runtime oop.

> Настоящий ОО в языке возможен только через полноценную поддержку в рантайме, включая как минимум рефлексию (а лучше - MOP, в смысле read/write).

Что такое "настоящий ОО"?

gaa ★★
()
Ответ на: комментарий от lester

Пожалуй, единственная претензия к "оно таки там есть". Слишком сильное утверждение.

Я бы сказал "В плюсах есть зачатки ОО, реализованные в виде толстого слоя синтаксического сахара над С (с небольшой потерей совместимости с последним)".

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

svu ★★★★★
()
Ответ на: комментарий от svu

> Безусловно, гораздо проще использовать языки, где ОО не на уровне макросов-библиотек. Глупо с этим спорить.

То есть мы плавно подошли к тому, что gtk лучше использовать в биндингах от него к более другим языкам?

gaa ★★
()
Ответ на: комментарий от lester

Какого именно? Пример рефлексии на жабке? Как посмотреть класс, его интерфейсы-методы и пр?

svu ★★★★★
()
Ответ на: комментарий от svu

> Картинка с плагинами демонстрирует костыльность ОО в плюсах.

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

lester ★★★★
()
Ответ на: комментарий от svu

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

Какой оно даёт выигрыш, учитывая что

> использование памяти - все-таки vms очень беспечно с ней обращаются, в среднем.

?

gaa ★★
()
Ответ на: комментарий от svu

пример того как это может пригодится на практике - ну узнаю я, что обьекта 5 методов и их имена, ну и накуя мне это надо? :)

lester ★★★★
()
Ответ на: комментарий от gaa

> А то, что придётся учить этот "ооп на ц"

Это (если это правда) не проблемы gobject, это проблемы кривого байндинга.

> дабы не словить где-нибудь проблем из-за путаницы его классов с классами C++

use namespaces luke

> на каждое преобразование строки навешать по врапперу...

Не очень понял, нафига...

> Я уж не говорю про отвратную документацию этого libxml++

Правильно. Не говорите. Ибо тут это совершенно ни к селу, ни к городу.

Сдается мне, Вы кривизну одного байндинга решили мощным броском обобщить...

svu ★★★★★
()
Ответ на: комментарий от gaa

Сравнивать использование проца и памяти в одном предложении - это, извините, Выше моих скромных интеллектуальных возможностей. Для меня это разные "оси".

svu ★★★★★
()
Ответ на: комментарий от lester

C++ УГ по определению. страусиха совершила кардинальную ошибку, что сделала на базе С. Хотел как лучше, получилось как всегда, а большинство сишных проектов так и остались на С и их не меньше, чем плюсовских, и даже больше. Разработчики жабы правильно сделали, что создали другой язык, но в стиле С. И на него поперло больше народу, чем на плюсы. А истина такова, что 100%-ной переносимости не бывает.

anonymous
()
Ответ на: комментарий от svu

> В смысле удобства и скорости разработки - да.

А почему б не предоставить _сишный_ интерфейс для рисования кнопочек языку более высокого уровня, чтобы он на основе его построил свои объекты?

gaa ★★
()
Ответ на: комментарий от svu

> Сравнивать использование проца и памяти в одном предложении - это, извините, Выше моих скромных интеллектуальных возможностей. Для меня это разные "оси".

Ну да, Ваши программы идеально сферичны и не выделяют память, а только нагружают процессор :)

gaa ★★
()
Ответ на: комментарий от gaa

Интерфейс гтк - сишный. Но не процедурный, а ОО. Кстати, windows.h - тоже во многом ОО API. Только кривоватый. И тоже сишный.

svu ★★★★★
()
Ответ на: комментарий от svu

>> А то, что придётся учить этот "ооп на ц"

> Это (если это правда) не проблемы gobject, это проблемы кривого байндинга.

Кстати, попытался найти то место в доке, где была отсылка на gobject и с удивлением обнаружмл, что теперь там все строки -- std::string.

>> дабы не словить где-нибудь проблем из-за путаницы его классов с классами C++

> use namespaces luke

Нет, я об использовании g-классов как классов c++.

>> на каждое преобразование строки навешать по врапперу...

> Не очень понял, нафига...

Потому что в остальном проекте строки, допустим, std::wstring. А libxml++ требует Glib::ustring.

gaa ★★
()
Ответ на: комментарий от lester

>пример того как это может пригодится на практике - ну узнаю я, что обьекта 5 методов и их имена, ну и накуя мне это надо? :)

Вазвращаясь к тому что каждый програмист обязан в своей жизни написать парсер конфигов, посмотрим на такой пример:

Можно на методы повесить аннотации типа @ConfigurableProperty(propertyName="listen_port", mandatory=true) тип параметра здесь можно взять из непосредственно из метода, чтобы сконвертировать String->int, а потом, после того как инстанциировал класс по имени, запросить все методы с аннотациями и вызвать их с параметрами из конфига. Так можно вносить в проект новые подсистемы без изменения корневого кода в проекте.

Absurd ★★★
()
Ответ на: комментарий от svu

> Интерфейс гтк - сишный. Но не процедурный, а ОО.

Да, неточно выразился. Именно процедурный.

> Кстати, windows.h - тоже во многом ОО API. Только кривоватый. И тоже сишный.

В том-то и дело, что он только похож на ОО. Там макросов MS_OBJECT нет :)

gaa ★★
()
Ответ на: комментарий от gaa

Если я сравниваю потребление проца - я результаты сравнения использую сами по себе, не накладывая на результаты сравнения потребления памяти.

svu ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.