metaclass: (Default)
metaclass ([personal profile] metaclass) wrote2012-12-11 01:04 pm
Entry tags:

private/internal методы и классы в .NET

А вот скажите, почему у авторов гопнета так популярно делать классы и методы недоступными для разработчиков?
Сейчас сижу, например в ILSpy и делаю обертку над ServiceController, потому что нельзя без ловли исключений узнать, существует ли сервис, а конфигурацию сервиса так и вообще никак прямо узнать нельзя. При этом все полезные методы и классы (нативный интероп итд) сугубо приватные или внутренние.

[identity profile] evil-invader.livejournal.com 2012-12-11 10:07 am (UTC)(link)
я с такой же проблемой сталкивался, когда пытался подточить VCL для специфических задач. Так рубило, что уже чуть ли не думал, как бы сделать грязный хак.

[identity profile] w00dy.livejournal.com 2012-12-11 10:12 am (UTC)(link)
так у vcl жеж сорцы доступны

[identity profile] bydlorus.livejournal.com 2012-12-11 10:29 am (UTC)(link)
Т.е. в жабе такого нет? Непонятно, при чём тут .NET.

[identity profile] metaclass.livejournal.com 2012-12-11 10:35 am (UTC)(link)
Я жабу не так часто переписываю :)

[identity profile] volodymir-k.livejournal.com 2012-12-11 10:37 am (UTC)(link)
Разные базовые культуры. Начиная со Страуструпа наСильники параноидально закрывают свои сундуки классы от внешнего мира, как гуры рекомендуют. Явисты глядят на смолток традиции, "давайте оставим если можно, вдруг пригодится" -- закрыты обычно только секурити методы.

Лично мне сишное прошлое предыдущего автора кода становится ясно видно по характерным подходам.

[identity profile] evil-invader.livejournal.com 2012-12-11 10:40 am (UTC)(link)
перекомпиливать vcl?

[identity profile] bydlorus.livejournal.com 2012-12-11 10:40 am (UTC)(link)
Хорошее объяснение.

[identity profile] w00dy.livejournal.com 2012-12-11 10:43 am (UTC)(link)
как минимум то что нужно. Плюс наличие сорцов облегчает анализ. Я таким образом нашёл у DevExpress-овского грида обходные пути и сделал то что нужно было.

[identity profile] evil-invader.livejournal.com 2012-12-11 10:57 am (UTC)(link)
ну вот по сорцам я как раз и понял, что нужные мне методы в привате. Не перекомпиливать vcl может и хорошая идея, но тогда на все машины разработчиков пришлось бы мою версию vcl ставить.

[identity profile] berezovsky.livejournal.com 2012-12-11 10:58 am (UTC)(link)
ещё помню западло было, если сервис управляется с клиентского компа, надо было спрашивать админовские креденшиалы, шифровать, передавать на сервер, делать имперсонацию контекста и только потом дёргать сервис контроллер
Edited 2012-12-11 11:02 (UTC)

[identity profile] gineer.livejournal.com 2012-12-11 11:07 am (UTC)(link)
Угу... вы еще про Эппл подобное спросите. :)

[identity profile] w00dy.livejournal.com 2012-12-11 11:19 am (UTC)(link)
насчёт пересобрать всё я кажется погорячился. Как ещё вариант - отнаследоваться от нужного класса, перетащить в него всё что нужно и править. Чтобы таскать не всю vcl, а только минимум, если такое возможно и имеет смысл. Ну а перетянуть разрабов просто - положил бинарники в репо, настроил все пути чтобы искало там. Со следующим апдейтом всё приедет всем ;)

[identity profile] psilogic.livejournal.com 2012-12-11 11:29 am (UTC)(link)
Это не только у авторов гоп-нета.
Обычно "приватизируют" ради совместимости - чтобы потом спокойно менять в следующих версиях, а кто полез хакать - сам дурак.

[identity profile] altmind.livejournal.com 2012-12-11 11:36 am (UTC)(link)
торжество инкапсюляции начинается тогда, когда в умах программистов начинают бродить мысли о CYA(клиенты расширяют классы, нарушают контракты в коде а потом сношают мозг саппорту). Когда программисты понимают, что не могут предусмотреть все случаи использования компонентов и что возможность кастомизации любых классов является залогом расширяемости и гибкости, появляется инкапсюляция в стиле питона, где инкапсюляция не энфорсится.

отдельного разговора требует принцип "make all classes final by default", по которому в свое время проехался nikitonsky.

[identity profile] bydl0coder.livejournal.com 2012-12-11 11:38 am (UTC)(link)
"Бляди, сэр".

[identity profile] bydl0coder.livejournal.com 2012-12-11 11:40 am (UTC)(link)
Ситуация "ССЗБ" это когда все методы и классы открыты - воруй, убивай, еби гусей, но будь готов ответить по закону. А тут все закрыто и "хак" заключается в создании форка.

[identity profile] bydl0coder.livejournal.com 2012-12-11 11:41 am (UTC)(link)
Делал "форк" ASP.NET MVC, чтобы отправлять с веб-сайта письма. Это последней каплей стало.

[identity profile] n16bs.livejournal.com 2012-12-11 12:11 pm (UTC)(link)
Ну какбэ очевидно что то, что паблик - этим будут пользоваться индусыюзеры. Значит на это нужно писать доку в мсдн, нужно продумать 100500 безумных способов которыми юзер заюзает эти методы, нужно отвечать на вопросы про них в social.ms.com и т.д.

И что, неужели в этих ваших скалах в стандартной либе всё наружу торчит?

[identity profile] n16bs.livejournal.com 2012-12-11 12:12 pm (UTC)(link)
Алсо >ILSpy
Попробуйте DotPeek от jetbrains.

(Anonymous) 2012-12-11 12:13 pm (UTC)(link)
Из-за сего факта пришлось писать свой Heap, с поддержкой удаления элемента по валуе из серединки. Как стандартными контейнерами сделать тоже я не разобрался.
А так бы как унаследовался бы, прикрутил бы сбоку кэшер позиций в значений в массиве...

[identity profile] denisioru.livejournal.com 2012-12-11 12:22 pm (UTC)(link)
а штатный SmtpClient не оло?

[identity profile] metaclass.livejournal.com 2012-12-11 12:31 pm (UTC)(link)
В скале если не писать модификаторов - по умолчанию будет public. В гопнете - private.

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

[personal profile] alll 2012-12-11 12:33 pm (UTC)(link)
ну какбэ открытость метода - это некий контракт на поддержание его в совместимом состоянии (выполняемый ли в дальнейшем - отдельный философский вопрос), желание отдельно взятого пользователя библиотеки воровать-убивать-и_третье_тоже тут не при чём

[identity profile] berezovsky.livejournal.com 2012-12-11 12:38 pm (UTC)(link)
в гопнете вроде интернал

[identity profile] bydl0coder.livejournal.com 2012-12-11 12:42 pm (UTC)(link)
Шаблон в строчку не рендерился. Соотв. класс принимает на вход стрим, но пишет в HttpContext.Current. Because fuck you, that's why.

[identity profile] denisioru.livejournal.com 2012-12-11 12:43 pm (UTC)(link)
Всмысле, в чем трудности отрендерить view в строку?

[identity profile] psilogic.livejournal.com 2012-12-11 12:43 pm (UTC)(link)
если все закрыто, значит вся эта архитектура может в следующей версии по пизде пойти

[identity profile] vit-r.livejournal.com 2012-12-11 12:49 pm (UTC)(link)
Старинная политика фирмы

[identity profile] bydl0coder.livejournal.com 2012-12-11 12:50 pm (UTC)(link)
В том, что Микрософт на это забил. Пришлось вытащить три или четыре класса, потому что все нужное internal или протектед.

[identity profile] n16bs.livejournal.com 2012-12-11 01:07 pm (UTC)(link)
Я сомневаюсь что в фреймфорке методы закрыты лишь потому, что это дефолтное поведение компилятора.

[identity profile] falcrum.livejournal.com 2012-12-11 01:16 pm (UTC)(link)
Это показатель, да: «либо автор на ирц сидит»... :)

[identity profile] pv-jewel.livejournal.com 2012-12-11 01:17 pm (UTC)(link)
Открыть никогда не поздно. Особенно в следующей версии.

[identity profile] pv-jewel.livejournal.com 2012-12-11 01:22 pm (UTC)(link)
классы - internal, методы - private

[identity profile] bydl0coder.livejournal.com 2012-12-11 01:58 pm (UTC)(link)
Ну и пусть идет, у меня старая либа останется, благо, можно указать, какая версия нужна.

[identity profile] max630.livejournal.com 2012-12-11 02:03 pm (UTC)(link)
Ну а как по другому? Потом поменять направление обхода контейнера - и все говнохаки поломаются, визгу будет на весь интернет. Авторам это надо?

[identity profile] bydl0coder.livejournal.com 2012-12-11 02:04 pm (UTC)(link)
Нужно, кстати, развить конспирологическую версию о том, что во всем этом виноват интеллисенс. То есть можно накрутить лапши из говна (потому что интеллисенс показывает все разработчикам из МС), а потом закрыть (чтобы интеллисенс не показывал ее разработчикам приложений)

[identity profile] psilogic.livejournal.com 2012-12-11 02:41 pm (UTC)(link)
А когда в новой версии появится какая-то фича, которую вам захочется поюзать, вам придется тратить дополнительные усилия на переход к новой версии.

[identity profile] bydl0coder.livejournal.com 2012-12-11 03:04 pm (UTC)(link)
Как и говорилось выше, ССЗБ. В дотнете можно атрибут ставить.

[identity profile] sbj-ss.livejournal.com 2012-12-11 06:13 pm (UTC)(link)
Ребе, ви таки не слышали про crack-классы? Мы в своё время неоднократно пользовались.

[identity profile] sbj-ss.livejournal.com 2012-12-11 06:15 pm (UTC)(link)
Особенно смачно этот Холокост смотрится на WinAPI/OLE со своими CoSetProxyBlanket и иже с ними.

[identity profile] sbj-ss.livejournal.com 2012-12-11 06:17 pm (UTC)(link)
Кто на ирц, кто на героине.

[identity profile] w00dy.livejournal.com 2012-12-11 06:22 pm (UTC)(link)
про такой фокус не слышал. Забавная технология.

[identity profile] metaclass.livejournal.com 2012-12-11 06:27 pm (UTC)(link)
Я постоянно использую. Да его сам борланд везде использовал.
По моему, как обходной вариант - заебись.

[identity profile] mudasobwa.livejournal.com 2012-12-13 04:31 am (UTC)(link)
Не самый элегантный вариант, конечно, но reflection (http://stackoverflow.com/questions/135443/how-do-i-use-reflection-to-invoke-a-private-method-in-c) не поможет?

[identity profile] metaclass.livejournal.com 2012-12-13 08:13 am (UTC)(link)
Помог. Большую часть кода (нативные методы) я просто вытащил и скомпилировал, а нужные им данные вынял рефлекшеном.