Re[3]: За что я не люблю С++
От: 0xC0000005  
Дата: 01.06.09 12:07
Оценка: -1
Здравствуйте, criosray, Вы писали:

C>Здравствуйте, 0xC0000005, Вы писали:


C>(бред г-на с хацкерским ником вырезан цензурой)


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

C>Дотнет и джава прекрасно обходятся без недоразумения под названием "множественное наследование". boost и stl по структуре и удобству смотряться очень и очень бедно на фоне .NET Framework.


Итак начнём с реального примера, представте себе ОО дизаин, в котором есть ядро и то что доделывает сам клиент у себя, клиент не может менять код ядра, а только насоедовать классы, менять некоторый функционал и подменять core класс своим в рантайм. Так вот есть структура:
ClassA
| \
ClassB ClassC
/|\
ClassB1 ClassB2 ClassB3

В класс Α необходимо добавить один метод, если вы унаследуете от А, то он подменится, НО потомки оригинального А всё равно будут юзать оригинального родителя.

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

C>Множественное наследование такой же моветон, как и goto.


А у вас смотрю стиль автора текста, хотите так же о шарпе? Утка это так же тупо как аддресс функции, Делегация это так же наивно как сдвиг в сегменте

C>>А много ли явошарпы знают удобных, простых и "интуитивно" понятных способов расширить функционал языка? Вот у меня требование к либе, я хочу регить callbackи вот таким способом:

C>>alarmNotifier = GUIHandler::onAlarm + CoreRoutine::onAlarm
C>>и что? у вас есть "костыль"? или всё чего нету нам не надо? Ха, это мертвецки неправильно, и обычно такое отмирает как несовершенное.
C>То, что есть у Вас еще бОльший костыль.

C>obj.Alarm += OnAlarm;

C>obj.Alarm += (arg1, arg2) => { /* обработчик здесь */ };

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

C>Что до расширяемых .NET языков — смотрите Nemerle и Boo.


Я не говорю о других языках, я говорю о расширении в рамках одного языка, или Немерил с Бу компилятся родным шарповским компилятором?

C>>А как просто вам при вызове логгера указать текущее имя файла, исходника я имею ввиду,ай как вы ругали макросы, это так, это сяк, а как вы напишете:

C>>logger::log(__filename__, __line__, "log text")


C>
C>catch(Exception e) {
C>   Log.Error(e); // через рефлексию будет собрана информация об исключении, потоке, методе, сборке, стеке вызовов(!!!)
C>   throw;
C>}
C>


А вот это красота которую я от вас ожидал Как меня достали эти криворучки, которые думают что кинуть в лог всё что можно из стека это так круто, ведь там разберуться.
Вы опять кинули мне пример готового тёплого коричневого батончика, я просил номер строки, вы кинули весь Stack Trace, я знаю что это такое, и я знаю что взять стэк вызовов в С++ не составляет проблем.

А как взять имено номер строки в файле? Или это бага щарпа ещё не разработана?
Или в новой версии появится printFileAndLine и вы будете выдирать и парсить номер строки? Ах скока кода я перевидал с такими заплатками

C>И Вы осмеливались утверждать, что Вы что-то знаете об управляемых языках? Да уж по части логеров управляемые языки рвут неуправляемые (в т.к. С++), как тузик — грелку. Вам только мечтать об удобстве отладки и логирования, предоставляемых средствами управляемых сред.


Я осмеливаюсь утверждать что за такой код я бы вас уволил, будь то Ява или Шарп или Плюсы, этот стиль называется есть ошибка — нет ошибки.

А ЕСЛИ это не исключение?

C>>Ага, а теперь скажите мне, у меня огромный обьект, но я хочу сериализовать только, замете слово ТОЛЬКО хидеры во всей иерархий, вот так я это использовал:

C>>dataStream << Modifiers::HeadersOnly << hugeObject;

C>Сериализация в дотнет полностью управляется атрибутами. В С++ об этом опять же только мечтать.


C>
C>    [JsonObject(MemberSerialization.OptIn)]
C>    public class LoginResult
C>    {
C>        private ResultErrors errors = new ResultErrors();

C>        [JsonProperty("success")]
C>        public bool Success { get; set; }

C>        [JsonProperty("errors")]
C>        public ResultErrors Errors
C>        {
C>            get { return errors; } 
C>        }
C>    }
C>



Не не не дядя, ты не понял меня, есть класс который тебе дал один мужик, и надо его сериализовать для бор машинки другого дяди, ты тут всего-то один программер в большом проекте, а не Вася Пупкин с проектом Хелло Бил где можно менять всё что под руку попало, Слабо повторяю?

C>Вы сначала заставьте это компиллироваться под С++


C>>public <T> void f()

C>>{
C>> T t = new T();
C>> t.f();
C>>}

Под плюсы подобный код? Давайте прямо так навскидку с компиляцией

template<class T>
void f()
{
T t;
t.f();
}

class A
{
public:
void f(){}
};

int main()
{
f<A>();

return 0;
}

Компилится, работает.

C>>Вот скажите мне серьёзно, хоть один реальный пример в рамках одного приложения(про распределённые системы отдельный разговор), когда на этапе компиляции тип обьекта не известен, а если он известен, то зачем его узнавать? Потеряли — плохой дизайн и кучерявые руки!!! + обрезанность языка.

C>COM

КОМ это прадед распределённой модели — это отдельный разговор, если уж хотите посмотреть как это может работать без мета инфы красиво, посмотрите на внука КОМа — CORBA в имплементации Шмидта над ACE

C>>

C>>void func1 ( A& a );

C>>void func2 ( A a );

C>>В чем разница между этими описаниями (кроме того, что возможно программист просто пропустил символ '&') ?

C>>а в чём разница между func1(a) и func1(a.clone()), в том что в первом варианте кодер забыл вызвать клон
C>>А как передать строку в Яве, чтобы она была output parameter? Вот смеху то, надо создавать холдеры, и почему в яве

C>Ну давайте вспомним строки — самое больное место С++, чтоб забить последний гвоздь в гроб этого языка.


C>>
C>>void f(String s)
C>>{
C>>    s = "I'm dummy";
C>>}
C>>


C>>переданный параметр не поменяется? и Вообще ни один параметр не поменяется? ах сколько говна было сьедено на этом миллионами программистами и тестерами. И вы говорите о том что управляемые языки там просты?

C>Миллионами индусокодеров?

C>Опять же, в С# есть out параметры.


C>А уж если кидаться какашками, то давайте вспомним в С/С++ классическую ошибку:

C>if (a = 1) { ... }

C>об которую спотыкаются даже опытные программисты. Что заставляет многих применять костыль:


C>if (1 == a) { ... }


C>А уже про миллионы проблем, связанных с десятками реализаций строк и работы со строками в С++ на Вашем месте я б скромно умолчал.



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

C>>TO BE CONTINUED!!!

C>Не позорьтесь так больше.
Ну к вам это более применимо, 2 неправильных примера и незнание тематики (на С++ это не компилится итп)
Re[5]: За что я не люблю С++
От: 0xC0000005  
Дата: 01.06.09 12:18
Оценка: -2
Здравствуйте, criosray, Вы писали:

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


C>>>Множественное наследование такой же моветон, как и goto.

CC>>Какое смелое заявление.
C>Это факт.
C>http://c2.com/cgi/wiki?MisUsingMultipleInheritance
C>http://www.gotw.ca/publications/mill06.htm


C>

C>Scott Meyers is one of the leading gurus in the C++ languages, in his book "Effective C++", the "is a" relationship for public inheritance is being mentioned in item 35: Make sure public inheritance models "is a".

C>Beside that, the current chairman of the ISO C++ Standard Committee, Herb Sutter, have also mentioned that in one of his articles.


C>We need "controlled polymorphism" LSP IS-A, but in certain code only. Public inheritance should always model IS-A as per the Liskov Substitution Principle (LSP).[3] Nonpublic inheritance can express a restricted form of IS-A, even though most people identify IS-A with public inheritance alone. Given class Derived : private Base, from the point of view of outside code, a Derived object IS-NOT-A Base, and so of course can't be used polymorphically as a Base because of the access restrictions imposed by private inheritance. However, inside Derived's own member functions and friends only, a Derived object can indeed be used polymorphically as a Base (you can supply a pointer or reference to a Derived object where a Base object is expected), because members and friends have the necessary access. If instead of private inheritance you use protected inheritance, then the IS-A relationship is additionally visible to further-derived classes, which means subclasses can also make use of the polymorphism.


Многа букаф и ничего по существу.

C>>>>А как просто вам при вызове логгера указать текущее имя файла, исходника я имею ввиду,ай как вы ругали макросы, это так, это сяк, а как вы напишете:

C>>>>logger::log(__filename__, __line__, "log text")

C>>>
C>>>catch(Exception e) {
C>>>   Log.Error(e); // через рефлексию будет собрана информация об исключении, потоке, методе, сборке, стеке вызовов(!!!)
C>>>   throw;
C>>>}
C>>>


CC>>А ничего что то, что ты написал к logger::log(__filename__, __line__, "log text") не имеет вообще никакого отношения даже близко.

C>Конечно имеет. Но если хотите один в один, то ради бога:
C>Log.Info("log text");

А кто просил время выводить? По рукам, по рукам и никакой премии, хакер узнал лишнюю инфу из пользовательского лога, вы уволены.
Re[4]: За что я не люблю С++
От: criosray  
Дата: 01.06.09 12:53
Оценка: +1 -1
Здравствуйте, 0xC0000005, Вы писали:


C>>(бред г-на с хацкерским ником вырезан цензурой)


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


Не только, но только "кулхацкеры" вбирают себе в качестве ника "код ошибки доступа к памяти в 16ричном формате".

C>>Дотнет и джава прекрасно обходятся без недоразумения под названием "множественное наследование". boost и stl по структуре и удобству смотряться очень и очень бедно на фоне .NET Framework.


C>Итак начнём с реального примера, представте себе ОО дизаин, в котором есть ядро и то что доделывает сам клиент у себя, клиент не может менять код ядра, а только насоедовать классы, менять некоторый функционал и подменять core класс своим в рантайм. Так вот есть структура:

C>ClassA
C> | \
C>ClassB ClassC
C>/|\
C>ClassB1 ClassB2 ClassB3

C>В класс Α необходимо добавить один метод, если вы унаследуете от А, то он подменится, НО потомки оригинального А всё равно будут юзать оригинального родителя.


C>При множественном наследовании данная зада решается очень просто всего одним классом, думаю вам как мега-кодеру не надо примеров. На ненастоящих языках все все потомки которые не абстрактные должны добавить этот метод. Тут ещё убирается нафиг полиморфизм и новые костыли вставляются в код.


Не надо тут никакого многожественного наследования:
СlassA
|
OpenForModificationsClassA — добавляем методы сюда
| \
ClassB СlassC
/ | \


C>>Множественное наследование такой же моветон, как и goto.


C>А у вас смотрю стиль автора текста, хотите так же о шарпе? Утка это так же тупо как аддресс функции, Делегация это так же наивно как сдвиг в сегменте


Что не так с моим стилем? Это давно известный факт, что множественное наследование — источник великого множества проблем и что решение "единичное наследование + множественная реализация интерфейсом" является гораздо более оптимальным и дотнет фреймворк есть тому прямое доказательство.

C>>>А много ли явошарпы знают удобных, простых и "интуитивно" понятных способов расширить функционал языка? Вот у меня требование к либе, я хочу регить callbackи вот таким способом:

C>>>alarmNotifier = GUIHandler::onAlarm + CoreRoutine::onAlarm
C>>>и что? у вас есть "костыль"? или всё чего нету нам не надо? Ха, это мертвецки неправильно, и обычно такое отмирает как несовершенное.
C>>То, что есть у Вас еще бОльший костыль.

C>>obj.Alarm += OnAlarm;

C>>obj.Alarm += (arg1, arg2) => { /* обработчик здесь */ };

C>Вы видимо не поняли мой пример из-за его простоты, я хотел спрятать рутину обработчиков итп вещей.


Объясните.

C>>Что до расширяемых .NET языков — смотрите Nemerle и Boo.


C>Я не говорю о других языках, я говорю о расширении в рамках одного языка, или Немерил с Бу компилятся родным шарповским компилятором?


Зачем? Язык абсолютно не важен. Дотнет сборки Nemerle и Boo (С#, VB.NET, F# и т.д. — любом дотнет языке) подключаются к любому дотнет проекту. Интеграция полностью прозрачная.

C>>
C>>catch(Exception e) {
C>>   Log.Error(e); // через рефлексию будет собрана информация об исключении, потоке, методе, сборке, стеке вызовов(!!!)
C>>   throw;
C>>}
C>>


C>А вот это красота которую я от вас ожидал Как меня достали эти криворучки, которые думают что кинуть в лог всё что можно из стека это так круто, ведь там разберуться.

Не понял полета мысли. Что значит "все, что можно из стека"? Естественно, при логировании имеет смысл писать в лог максимум информации. Что не так?

C>Вы опять кинули мне пример готового тёплого коричневого батончика, я просил номер строки, вы кинули весь Stack Trace, я знаю что это такое, и я знаю что взять стэк вызовов в С++ не составляет проблем.

Нет, Вы не знаете что такое StackTrace. Открою Вам глазки:

            StackTrace stackTrace = new StackTrace(true);
            var frame = stackTrace.GetFrame(1);
            frame.GetFileColumnNumber();
            frame.GetFileLineNumber();
            frame.GetFileName();
            frame.GetILOffset();
            frame.GetMethod();
            frame.GetNativeOffset();


Еще вопросы будут?

C>А как взять имено номер строки в файле? Или это бага щарпа ещё не разработана?

C>Или в новой версии появится printFileAndLine и вы будете выдирать и парсить номер строки? Ах скока кода я перевидал с такими заплатками
Рассказывайте свои фантазии в другом месте, ок.

C>>И Вы осмеливались утверждать, что Вы что-то знаете об управляемых языках? Да уж по части логеров управляемые языки рвут неуправляемые (в т.к. С++), как тузик — грелку. Вам только мечтать об удобстве отладки и логирования, предоставляемых средствами управляемых сред.


C>Я осмеливаюсь утверждать что за такой код я бы вас уволил, будь то Ява или Шарп или Плюсы, этот стиль называется есть ошибка — нет ошибки.

Что значит есть — нет? Вы throw не заметили? Так это Вас, а не меня увольнять надо.

C>А ЕСЛИ это не исключение?

Что "это"? сatch(Exception e) ловит все исключения (т.к. он является базовым классом для классов исключений в дотнет). Не знали об этом?
Можно конечно прицепиться, что делать сatch (Exception e) {} тоже моветон, но я привел этот код как простейший пример. Если не нравится, то можно переписать


сatch(MyAppFaultConditionException e)
{
    Log.Error(e);
    throw;   
}

Cути это не поменяет.

C>>>Ага, а теперь скажите мне, у меня огромный обьект, но я хочу сериализовать только, замете слово ТОЛЬКО хидеры во всей иерархий, вот так я это использовал:

C>>>dataStream << Modifiers::HeadersOnly << hugeObject;

C>>Сериализация в дотнет полностью управляется атрибутами. В С++ об этом опять же только мечтать.


C>>
C>>    [JsonObject(MemberSerialization.OptIn)]
C>>    public class LoginResult
C>>    {
C>>        private ResultErrors errors = new ResultErrors();

C>>        [JsonProperty("success")]
C>>        public bool Success { get; set; }

C>>        [JsonProperty("errors")]
C>>        public ResultErrors Errors
C>>        {
C>>            get { return errors; } 
C>>        }
C>>    }
C>>



C>Не не не дядя, ты не понял меня, есть класс который тебе дал один мужик, и надо его сериализовать для бор машинки другого дяди, ты тут всего-то один программер в большом проекте, а не Вася Пупкин с проектом Хелло Бил где можно менять всё что под руку попало, Слабо повторяю?


И какие проблемы? Делаем DTO и атрибутами описываем какие поля сериализовать, какие — не сериализовать, какие сериализовать как атрибуты, а какие — как ноды (если речь о Xml-сериализации).

Кстати, как там с Xml-сериализацией в С++?

C>>Вы сначала заставьте это компиллироваться под С++


C>>>public <T> void f()

C>>>{
C>>> T t = new T();
C>>> t.f();
C>>>}

C>Под плюсы подобный код? Давайте прямо так навскидку с компиляцией


    class A : IAinterface
    {
        public void f() {}
    }

    internal interface IAinterface
    {
        void f();
    }

    class Program
    {
        static public void foo<T>() where T : IAinterface
        {
            var a = new A();
        }

        static void Main(string[] args)
        {
            foo<A>();
        }
    }


C>Компилится, работает.

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

C>>>Вот скажите мне серьёзно, хоть один реальный пример в рамках одного приложения(про распределённые системы отдельный разговор), когда на этапе компиляции тип обьекта не известен, а если он известен, то зачем его узнавать? Потеряли — плохой дизайн и кучерявые руки!!! + обрезанность языка.

C>>COM

C>КОМ это прадед распределённой модели — это отдельный разговор, если уж хотите посмотреть как это может работать без мета инфы красиво, посмотрите на внука КОМа — CORBA в имплементации Шмидта над ACE

Да при чем тут DCOM? Я говорю о классическом COM.

C duck typing (boo):

import System.Threading

def CreateInstance(progid):
   type = System.Type.GetTypeFromProgID(progid)    
   return type()    

ie as duck = CreateInstance("InternetExplorer.Application")
ie.Visible = true
ie.Navigate2("http://www.go-mono.com/monologue/")

Thread.Sleep(50ms) while ie.Busy

document = ie.Document
print("${document.title} is ${document.fileSize} bytes long.")


теперь то же самое без duck typing (boo):


import System.Threading
import System.Reflection

def CreateInstance(progid):
    type = System.Type.GetTypeFromProgID(progid)    
    return type()    
    
def SetProperty(target, name, value):
    target.GetType().InvokeMember(name, BindingFlags.SetProperty, null, target, (value,))
    
def GetProperty(target, name):
    return target.GetType().InvokeMember(name, BindingFlags.GetProperty, null, target, null)
    
def Invoke(target, name, arg):
    return target.GetType().InvokeMember(name, BindingFlags.InvokeMethod, null, target, (arg,))

ie = CreateInstance("InternetExplorer.Application")
SetProperty(ie, "Visible", true)
Invoke(ie, "Navigate2", "http://www.go-mono.com/monologue/")

Thread.Sleep(50ms) while GetProperty(ie, "Busy")

document = GetProperty(ie, "Document")
print("${GetProperty(document, 'title')} is ${GetProperty(document, 'fileSize')} bytes long.")


В С++ будет еще (на порядок) уродливее.


C>Это хорошо что в шарпах есть аут параметры, хоть чего-то увидели в ошибках Явы.

C>А как строки относятся к языку? Этож не паскаль
Строка такой же базовый тип данных, как и int, double, bool, и т.д. Если этого не понимать, то получится тот зоопарк реализаций с миллионом граблей, который мы наблюдаем в С++.

C>и чем вам std::string не строка, когда-то веб сервак делал заточенный под одного клиента, так там все буфера отлично на этих строках работали.

Одна из реализаций. Как-там у нее с юникодом, кстати?

C>>>TO BE CONTINUED!!!

C>>Не позорьтесь так больше.
C>Ну к вам это более применимо, 2 неправильных примера и незнание тематики (на С++ это не компилится итп)
Каких примера, какой терминологии. Не стесняйтесь — выкладывайте.
Re[6]: За что я не люблю С++
От: criosray  
Дата: 01.06.09 12:59
Оценка:
Здравствуйте, 0xC0000005, Вы писали:

C>>

C>>Scott Meyers is one of the leading gurus in the C++ languages, in his book "Effective C++", the "is a" relationship for public inheritance is being mentioned in item 35: Make sure public inheritance models "is a".

C>>Beside that, the current chairman of the ISO C++ Standard Committee, Herb Sutter, have also mentioned that in one of his articles.


C>>We need "controlled polymorphism" LSP IS-A, but in certain code only. Public inheritance should always model IS-A as per the Liskov Substitution Principle (LSP).[3] Nonpublic inheritance can express a restricted form of IS-A, even though most people identify IS-A with public inheritance alone. Given class Derived : private Base, from the point of view of outside code, a Derived object IS-NOT-A Base, and so of course can't be used polymorphically as a Base because of the access restrictions imposed by private inheritance. However, inside Derived's own member functions and friends only, a Derived object can indeed be used polymorphically as a Base (you can supply a pointer or reference to a Derived object where a Base object is expected), because members and friends have the necessary access. If instead of private inheritance you use protected inheritance, then the IS-A relationship is additionally visible to further-derived classes, which means subclasses can also make use of the polymorphism.


C>Многа букаф и ничего по существу.


Конечно. Скот Майерс — С++ гуру будет писать не по существу. Куда уж ему до господина с кулхацкерским ником с кывта.

C>>>>>А как просто вам при вызове логгера указать текущее имя файла, исходника я имею ввиду,ай как вы ругали макросы, это так, это сяк, а как вы напишете:

C>>>>>logger::log(__filename__, __line__, "log text")

C>>>>
C>>>>catch(Exception e) {
C>>>>   Log.Error(e); // через рефлексию будет собрана информация об исключении, потоке, методе, сборке, стеке вызовов(!!!)
C>>>>   throw;
C>>>>}
C>>>>


CC>>>А ничего что то, что ты написал к logger::log(__filename__, __line__, "log text") не имеет вообще никакого отношения даже близко.

C>>Конечно имеет. Но если хотите один в один, то ради бога:
C>>Log.Info("log text");

C>А кто просил время выводить? По рукам, по рукам и никакой премии, хакер узнал лишнюю инфу из пользовательского лога, вы уволены.

Ну не выводите. Формат лога настраивается как душе угодно. И какое вообще это имеет отношение к теме?
Re[4]: За что я не люблю С++
От: criosray  
Дата: 01.06.09 13:38
Оценка:
Здравствуйте, 0xC0000005, Вы писали:

C>>COM


C>КОМ это прадед распределённой модели — это отдельный разговор, если уж хотите посмотреть как это может работать без мета инфы красиво, посмотрите на внука КОМа — CORBA в имплементации Шмидта над ACE


Кстати, совсем забыл указать на еще один ляп в Вашем посте. CORBA ну никак не может быть "внуком COM", т.к. появилась за два года до COM — в 91ом.
Re[5]: За что я не люблю С++
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 01.06.09 13:45
Оценка:
Здравствуйте, criosray, Вы писали:

C>>>Множественное наследование такой же моветон, как и goto.

CC>>Какое смелое заявление.
C>Это факт.
C>http://c2.com/cgi/wiki?MisUsingMultipleInheritance

Хм. Misusing = моветон? У тебя снова какое-то странное прочтение. Можно в микроволновку сунуть домашнюю собаку, это ещё не означает, что микроволновка или домашняя собака — моветон.

C>http://www.gotw.ca/publications/mill06.htm


C>

C>Scott Meyers is one of the leading gurus in the C++ languages, in his book "Effective C++", the "is a" relationship for public inheritance is being mentioned in item 35: Make sure public inheritance models "is a".

C>Beside that, the current chairman of the ISO C++ Standard Committee, Herb Sutter, have also mentioned that in one of his articles.


C>We need "controlled polymorphism" LSP IS-A, but in certain code only. Public inheritance should always model IS-A as per the Liskov Substitution Principle (LSP).[3] Nonpublic inheritance can express a restricted form of IS-A, even though most people identify IS-A with public inheritance alone. Given class Derived : private Base, from the point of view of outside code, a Derived object IS-NOT-A Base, and so of course can't be used polymorphically as a Base because of the access restrictions imposed by private inheritance. However, inside Derived's own member functions and friends only, a Derived object can indeed be used polymorphically as a Base (you can supply a pointer or reference to a Derived object where a Base object is expected), because members and friends have the necessary access. If instead of private inheritance you use protected inheritance, then the IS-A relationship is additionally visible to further-derived classes, which means subclasses can also make use of the polymorphism.


При чём тут множественное наследование? В процитированной тобой статье речь идёт о наследовании вообще.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[5]: За что я не люблю С++
От: CreatorCray  
Дата: 01.06.09 13:49
Оценка:
Здравствуйте, criosray, Вы писали:

C>>А ЕСЛИ это не исключение?

C>Что "это"? сatch(Exception e) ловит все исключения (т.к. он является базовым классом для классов исключений в дотнет). Не знали об этом?
Он о том, что запись в лог вызвана не в результате исключения или какой либо ошибки.

C>Аналогично. При чем более выразительно, т.к. контракт, которому должна соответствовать специализация дженерика, указан явно.

Пиписки оказались одинаковой длины.

C>>А как строки относятся к языку? Этож не паскаль

C>Строка такой же базовый тип данных, как и int, double, bool, и т.д.
Неа. Это решать автору языка: базовый или не базовый.

C>Если этого не понимать, то получится тот зоопарк реализаций с миллионом граблей, который мы наблюдаем в С++.

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

C>Одна из реализаций. Как-там у нее с юникодом, кстати?

y wstring USC2 100% поддерживается
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Re[2]: За что я не люблю С++
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 01.06.09 13:52
Оценка: +3
Здравствуйте, 0xC0000005, Вы писали:

C>У него было руководство по ООП — книга по паскалю. Занятно, как такой гений (как о нём тут шарписты шаркают) выбрал имено Паскаль 5.5, ведь в нём небыло обьектов, если помните Pascal with Objects был введён с версии 7.0 борландовсой ИДЕ [...]


Тут ты ошибаешься. Ошибка простительная, ты мог этого просто не знать по юности. На самом деле, классы появились в 5.5, а в 6.0 уже появился Turbo Vision, в 7.0 — редактор с подсветкой синтаксиса. Это так, не полемики ради, а энциклопедистики для.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[7]: За что я не люблю С++
От: 0xC0000005  
Дата: 01.06.09 13:53
Оценка:
Здравствуйте, criosray, Вы писали:

C>Здравствуйте, 0xC0000005, Вы писали:


C>>>

C>>>Scott Meyers is one of the leading gurus in the C++ languages, in his book "Effective C++", the "is a" relationship for public inheritance is being mentioned in item 35: Make sure public inheritance models "is a".

C>>>Beside that, the current chairman of the ISO C++ Standard Committee, Herb Sutter, have also mentioned that in one of his articles.


C>>>We need "controlled polymorphism" LSP IS-A, but in certain code only. Public inheritance should always model IS-A as per the Liskov Substitution Principle (LSP).[3] Nonpublic inheritance can express a restricted form of IS-A, even though most people identify IS-A with public inheritance alone. Given class Derived : private Base, from the point of view of outside code, a Derived object IS-NOT-A Base, and so of course can't be used polymorphically as a Base because of the access restrictions imposed by private inheritance. However, inside Derived's own member functions and friends only, a Derived object can indeed be used polymorphically as a Base (you can supply a pointer or reference to a Derived object where a Base object is expected), because members and friends have the necessary access. If instead of private inheritance you use protected inheritance, then the IS-A relationship is additionally visible to further-derived classes, which means subclasses can also make use of the polymorphism.


C>>Многа букаф и ничего по существу.


C>Конечно. Скот Майерс — С++ гуру будет писать не по существу. Куда уж ему до господина с кулхацкерским ником с кывта.


Во первых переход на личности не показывает вас с лучшей стороны, во вторых я говорил о вашей цитате Майерса, а не о самой его цитате. То что вы впихнули сюда это, вот что не по существу, не поленитесь написать одинм-двумя предложениями в чём проблема С++ поддержки множественного наследования, а не множественного наследования такогого.
Поймите, что и С++ и Ява поддверживают множественное наследовние как таковое, только вот используют разные методы обхода ловушек, таких как двоиственность, С++ добавляет виртуальное наследование, Ява разрешает наследовать только от одного не абстрактного класса, а все остальные классы должны быть чисто абстрактными (ака интерфейс).
И какой-же геморой вас ждёт, когда интерфейс должен иметь один маленький метод.

C>>>>>>А как просто вам при вызове логгера указать текущее имя файла, исходника я имею ввиду,ай как вы ругали макросы, это так, это сяк, а как вы напишете:

C>>>>>>logger::log(__filename__, __line__, "log text")

C>>>>>
C>>>>>catch(Exception e) {
C>>>>>   Log.Error(e); // через рефлексию будет собрана информация об исключении, потоке, методе, сборке, стеке вызовов(!!!)
C>>>>>   throw;
C>>>>>}
C>>>>>


CC>>>>А ничего что то, что ты написал к logger::log(__filename__, __line__, "log text") не имеет вообще никакого отношения даже близко.

C>>>Конечно имеет. Но если хотите один в один, то ради бога:
C>>>Log.Info("log text");

C>>А кто просил время выводить? По рукам, по рукам и никакой премии, хакер узнал лишнюю инфу из пользовательского лога, вы уволены.

C>Ну не выводите. Формат лога настраивается как душе угодно. И какое вообще это имеет отношение к теме?

Так вот пишите то, о чем вас попросили, а не полёт фантазии на тему "Как это будет красивее"
Re[6]: За что я не люблю С++
От: CreatorCray  
Дата: 01.06.09 13:58
Оценка: 3 (1) +4 -2 :))) :)
Здравствуйте, Геннадий Васильев, Вы писали:

ГВ>Хм. Misusing = моветон? У тебя снова какое-то странное прочтение. Можно в микроволновку сунуть домашнюю собаку, это ещё не означает, что микроволновка или домашняя собака — моветон.

ГВ>При чём тут множественное наследование? В процитированной тобой статье речь идёт о наследовании вообще.

Я все больше склоняюсь к выводу, что под ником criosray скрывается флеймобот, с которым вообще невозможно конструктивно общаться.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Re[5]: За что я не люблю С++
От: 0xC0000005  
Дата: 01.06.09 14:04
Оценка:
Здравствуйте, criosray, Вы писали:

C>Здравствуйте, 0xC0000005, Вы писали:


C>>>COM


C>>КОМ это прадед распределённой модели — это отдельный разговор, если уж хотите посмотреть как это может работать без мета инфы красиво, посмотрите на внука КОМа — CORBA в имплементации Шмидта над ACE


C>Кстати, совсем забыл указать на еще один ляп в Вашем посте. CORBA ну никак не может быть "внуком COM", т.к. появилась за два года до COM — в 91ом.




Давайте пробежимся по иерархий названий, но ActiveX, DCOM, OLE, DDE — это всё КОМ, и то что мелкомягкие называют новую версию не заставит меня называть одно другим, COM DDE
CORBA внук DDE, так вас больше устроит?

И говорив Внук я вовсе не имел ввиду что КОРБу сделали на основе КОМа, боже упаси, а вот по эволюции — КОМ это предшественник КОРБы
Re[6]: За что я не люблю С++
От: criosray  
Дата: 01.06.09 14:09
Оценка:
Здравствуйте, CreatorCray, Вы писали:

C>>>А ЕСЛИ это не исключение?

C>>Что "это"? сatch(Exception e) ловит все исключения (т.к. он является базовым классом для классов исключений в дотнет). Не знали об этом?
CC>Он о том, что запись в лог вызвана не в результате исключения или какой либо ошибки.
Какая разница?

C>>>А как строки относятся к языку? Этож не паскаль

C>>Строка такой же базовый тип данных, как и int, double, bool, и т.д.
CC>Неа. Это решать автору языка: базовый или не базовый.
Во всех нормальных языках так. Даже в Objective-C тип один единственный NSString — и никаких проблем с зоопарком строк, как в С++.

C>>Если этого не понимать, то получится тот зоопарк реализаций с миллионом граблей, который мы наблюдаем в С++.

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

C>>Одна из реализаций. Как-там у нее с юникодом, кстати?

CC>y wstring USC2 100% поддерживается
Разницу между std::string и std::wstring улавливаете?
Re[3]: За что я не люблю С++
От: 0xC0000005  
Дата: 01.06.09 14:14
Оценка: -1
Здравствуйте, Геннадий Васильев, Вы писали:

ГВ>Здравствуйте, 0xC0000005, Вы писали:


C>>У него было руководство по ООП — книга по паскалю. Занятно, как такой гений (как о нём тут шарписты шаркают) выбрал имено Паскаль 5.5, ведь в нём небыло обьектов, если помните Pascal with Objects был введён с версии 7.0 борландовсой ИДЕ [...]


ГВ>Тут ты ошибаешься. Ошибка простительная, ты мог этого просто не знать по юности. На самом деле, классы появились в 5.5, а в 6.0 уже появился Turbo Vision, в 7.0 — редактор с подсветкой синтаксиса. Это так, не полемики ради, а энциклопедистики для.


Насколько я помню в 6-ке классы появились как адд-он, хотя уже не вспомню точно как было.
Re[6]: За что я не люблю С++
От: criosray  
Дата: 01.06.09 14:15
Оценка: +1
Здравствуйте, 0xC0000005, Вы писали:



C>>>>COM


C>>>КОМ это прадед распределённой модели — это отдельный разговор, если уж хотите посмотреть как это может работать без мета инфы красиво, посмотрите на внука КОМа — CORBA в имплементации Шмидта над ACE


C>>Кстати, совсем забыл указать на еще один ляп в Вашем посте. CORBA ну никак не может быть "внуком COM", т.к. появилась за два года до COM — в 91ом.


C>Давайте пробежимся по иерархий названий, но ActiveX, DCOM, OLE, DDE — это всё КОМ, и то что мелкомягкие называют новую версию не заставит меня называть одно другим, COM DDE

C>CORBA внук DDE, так вас больше устроит?
C>И говорив Внук я вовсе не имел ввиду что КОРБу сделали на основе КОМа, боже упаси, а вот по эволюции — КОМ это предшественник КОРБы
Чушь полная.

Немного ликбеза: COM и DDE были созданы с целью коммуникации между процессами в пределах одного компьютера.
CORBA и (много позже) DCOM были созданы для коммуникации между приложениями в сети.

Разницу чувствуете?

А Ваши бурные фантазии на тему кто чей внук/правну/дедушка/папка/мамка лучше оставьте при себе.
Re[5]: За что я не люблю С++
От: Antikrot  
Дата: 01.06.09 14:17
Оценка: +1 :)
Здравствуйте, criosray, Вы писали:

C>Это все замечательно, но Вы выпускаете из виду одну простую истину — производительность важна только там, где ее не хватает. В недавнем обсуждении выяснилось, например, что числомолотилка на дотнет работает быстрее, чем числомолотилка на С++, если компилировать со стандартными настройками. Да, пересобрав ее с SSE3 и всеми возможными оптимизациями получили выигрышь примерно в три раза.


offtopic:
не всеми возможными
векторизация sincos в том примере позволяет на плюсах отыграть еще секунду но это тааакая ересь в коде получается
Re[4]: За что я не люблю С++
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 01.06.09 14:22
Оценка: +1
Здравствуйте, 0xC0000005, Вы писали:

ГВ>>Тут ты ошибаешься. Ошибка простительная, ты мог этого просто не знать по юности. На самом деле, классы появились в 5.5, а в 6.0 уже появился Turbo Vision, в 7.0 — редактор с подсветкой синтаксиса. Это так, не полемики ради, а энциклопедистики для.

C>Насколько я помню в 6-ке классы появились как адд-он, хотя уже не вспомню точно как было.

Я точно помню, как было — это был мой первый ОО-язык. Addon-ом, вернее библиотекой, был Turbo Vision (уже — в 6.0). Собственно, я хотел тебе намекнуть на другое: то, что ты говоришь, оно по сути правильно, но небрежность в исторических отсылках даёт лишний повод проигнорировать твои доводы.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[8]: За что я не люблю С++
От: criosray  
Дата: 01.06.09 14:26
Оценка:
Здравствуйте, 0xC0000005, Вы писали:


C>>Конечно. Скот Майерс — С++ гуру будет писать не по существу. Куда уж ему до господина с кулхацкерским ником с кывта.


C>Во первых переход на личности не показывает вас с лучшей стороны,

Где Вы увидели личности?
C>во вторых я говорил о вашей цитате Майерса, а не о самой его цитате. То что вы впихнули сюда это, вот что не по существу, не поленитесь написать одинм-двумя предложениями в чём проблема С++ поддержки множественного наследования, а не множественного наследования такогого.
Проблема в самой концепции множественного наследования. Множественное наследование, хотя и бывает полезно в некоторых редких случаях, в исключительном большинстве других лишь значительно усложняет дизайн графа классов и создаем тем самым большой потенциал для ошибок дизайна — куда более страшных ошибок, чем большинства других, т.к. рефакторинг и особенно в С++ за неимением нормальных модульных тестов — задача крайне сложная и зачастую просто невыполнимая без тотального переписывания здоровенных участков кода.

C>Поймите, что и С++ и Ява поддверживают множественное наследовние как таковое, только вот используют разные методы обхода ловушек, таких как двоиственность, С++ добавляет виртуальное наследование, Ява разрешает наследовать только от одного не абстрактного класса, а все остальные классы должны быть чисто абстрактными (ака интерфейс).

Вы не путайте наследование (inheritance) с реализацией (implementation). Так вот интерфейсы не наследуются, а реализуются. А наследование и в С# и в Java есть только одинарное.

C>И какой-же геморой вас ждёт, когда интерфейс должен иметь один маленький метод.

Что должен делать интерфейс?
Сморозили очередную глупость. Интерфейс — это просто контракт.

C>Так вот пишите то, о чем вас попросили, а не полёт фантазии на тему "Как это будет красивее"


По существу сказать нечего?
Re[7]: За что я не люблю С++
От: 0xC0000005  
Дата: 01.06.09 14:31
Оценка:
Здравствуйте, criosray, Вы писали:

C>Здравствуйте, 0xC0000005, Вы писали:




C>>>>>COM


C>>>>КОМ это прадед распределённой модели — это отдельный разговор, если уж хотите посмотреть как это может работать без мета инфы красиво, посмотрите на внука КОМа — CORBA в имплементации Шмидта над ACE


C>>>Кстати, совсем забыл указать на еще один ляп в Вашем посте. CORBA ну никак не может быть "внуком COM", т.к. появилась за два года до COM — в 91ом.


C>>Давайте пробежимся по иерархий названий, но ActiveX, DCOM, OLE, DDE — это всё КОМ, и то что мелкомягкие называют новую версию не заставит меня называть одно другим, COM DDE

C>>CORBA внук DDE, так вас больше устроит?
C>>И говорив Внук я вовсе не имел ввиду что КОРБу сделали на основе КОМа, боже упаси, а вот по эволюции — КОМ это предшественник КОРБы
C>Чушь полная.

C>Немного ликбеза: COM и DDE были созданы с целью коммуникации между процессами в пределах одного компьютера.

C>CORBA и (много позже) DCOM были созданы для коммуникации между приложениями в сети.

C>Разницу чувствуете?


C>А Ваши бурные фантазии на тему кто чей внук/правну/дедушка/папка/мамка лучше оставьте при себе.



И Ком и Корба имплементируют "КОМПОНЕНТНУЮ" модель, и даже idl у них на 99% одинаковый, и всё сводится к общению между компонентами, но КОРБА имеет дополнительные аспекты.

В общем начали с одного, закончили терминами, как обычно и делает crioSray.

Кстати, криоСрэй, какой стаж работы на С++? На примере когда ты сказал что в С++ шаблоне нельзя вызвать неделарированный метод из T, я могу сказать что С++ для тебя это Си с классами(если помнишь), и обсуждать темы такого порядка ты может только на уровне "Мне это не нравится и ВСЁ".

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

Всё больше и больше мне здаётся что криоСрэй и есть аффтар той доки, уж очень стиль похож.
Re[25]: За что я не люблю С++
От: March_rabbit  
Дата: 01.06.09 14:33
Оценка: +1 :)
Здравствуйте, Mamut, Вы писали:

M>> M>Лучше, если эти пять строк уже встроены в язык


M>> осторожно! Можно ведь и захотеть декодер mpc поиметь встроенный в язык


M>Пусть будет


M>> Ограничивать себя в сладостях надо


M>Зачем?

как зачем? потом устраивают флуд на тему "почему в винде только ИЕ встроен".
Встрой туда кодек mpc тут же начнутся вопли "почему такой, почему не другой, где свобода выбора"
Re[5]: За что я не люблю С++
От: 0xC0000005  
Дата: 01.06.09 14:33
Оценка:
Здравствуйте, Геннадий Васильев, Вы писали:

ГВ>Здравствуйте, 0xC0000005, Вы писали:


ГВ>>>Тут ты ошибаешься. Ошибка простительная, ты мог этого просто не знать по юности. На самом деле, классы появились в 5.5, а в 6.0 уже появился Turbo Vision, в 7.0 — редактор с подсветкой синтаксиса. Это так, не полемики ради, а энциклопедистики для.

C>>Насколько я помню в 6-ке классы появились как адд-он, хотя уже не вспомню точно как было.

ГВ>Я точно помню, как было — это был мой первый ОО-язык. Addon-ом, вернее библиотекой, был Turbo Vision (уже — в 6.0). Собственно, я хотел тебе намекнуть на другое: то, что ты говоришь, оно по сути правильно, но небрежность в исторических отсылках даёт лишний повод проигнорировать твои доводы.


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