metaclass: (Default)
[personal profile] metaclass
Наткнувшись в процессе проектирования проги на то, что мне одновременно необходимы фичи обычного C# со статической типизацией и фичи динамических языков, полез смотреть на IronPython/DLR и тому подобное. Ну, с ходу того, что меня интересует (адекватная интеграция с DBMS) я не нашел, GUI сложнее чем MessageBox("Hello, world"); тоже и в связи с этим возник вопрос:
На кого рассчитаны все нововведения в .NET 3.5/4.0?
Всякие там LINQ to SQL/Entity Framework/Expression Trees/DLR и прочее, причем production статус этого всего совершенно непонятен, неизвестно, что отомрет, что будет использоваться, итд. Все примеры для этого, которые я видел, они, мягко выражаясь, на уровне "select * from Customers -> УРА, Я ЗНАЮ SQL".

DLR, Expression Trees - рассчитаны на дизайнеров языков, причем в проекте IronScheme от DLR отказались ("but decided to abandon this idea because the DLR branch the project used became out of sync with the trunk, and also because the DLR, according to the developers, could not support the majority of the Scheme's requirements"). Как будто и так языков мало.

В общем, это все выглядит каким-то откровенным гиковством со стороны Microsoft, похоже там всякие выпускники CS факультетов затрахали в мозг менеджмент до состояния "пусть теребят свои монады как хотят, абы нас не трогали".


Это все при том, что высокоуровневые фичи в .NET как были кривые, так и остались, типа медленной отрисовки DataGridView или over-architected мрака в System.ComponentModel.

Date: 2010-08-04 10:48 am (UTC)
From: [identity profile] w00dy.livejournal.com
Вообще-то expression trees очень вкусная штука. Например в LINQ-2-SQL на пару с IQueryable они используются для построения запросов и выполнения их на стороне сервера. Также они могут использоваться в различных ORM-ах для более эфективной работы с данными. Тобишь умный ORM на запрос new Query ().Where (c => c.Name.StartWith ('i')).Select (c => new {c.Id, c.Name}) ; на сервере будет выполнять что-то аля select Id, Name from Customers where Name like 'i%'; вместо банального select * from Customers с фильтрацией и разбором на стороне клиента.

> медленной отрисовки DataGridView

Этих гридов для wf/asp.net/wpf как собак не резаных, выберите что-то себе по душе уже :)

Date: 2010-08-04 10:50 am (UTC)
From: [identity profile] w00dy.livejournal.com
сцукожж съел тип, было new Query<Customer> ()...

Date: 2010-08-04 10:54 am (UTC)
From: [identity profile] metaclass.livejournal.com
Я знаю что такое Expression Trees и как они используются в Linq2Sql. Только это нахрен не неправильно, к сожалению, т.к. нарушает Single Responsibility Principle - вместо структуры базы и запросов к ней мы имеем структуру базы, ее отражение в виде кода сгенеренного sqlmetal, запрос в виде LINQ и его конверсия в SQL провайдером. Не говоря уже о том, что этих провайдеров кроме как для MSSQL незаметно особо.
А уж если речь пойдет о чем-то, кроме простых запросов, так вообще святых выноси, Linq2SQL ничего кроме селектов не умеет, вроде.

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

Date: 2010-08-04 11:06 am (UTC)
From: [identity profile] norguhtar.livejournal.com

вместо структуры базы и запросов к ней мы имеем структуру базы, ее отражение в виде кода сгенеренного sqlmetal, запрос в виде LINQ и его конверсия в SQL провайдером.

Вы мне таки объясните зачем такой пиндец если это причем и не ORM в чистом виде? Для тех кто не осилил SQL?

Date: 2010-08-04 11:09 am (UTC)
From: [identity profile] metaclass.livejournal.com
Ну строго типизированные запросы, как бы. Толк от этого в отсутствие проверки "не поменялась ли база с последнего запуска sqlmetal" неясен.
Отсутствии внятного общего подмножества SQL для разных серверов, неясный статус этого проекта вообще тоже не добавляет радости.
(deleted comment)

Date: 2010-08-04 11:17 am (UTC)
From: [identity profile] metaclass.livejournal.com
Прога свалится при запуске и можно будет пофиксить. А не через месяц работы, когда бухгалтеру придет в голову открыть какой-нибудь очень редко используемый отчет.
Про TDD знаю - если я писать тесты, я до рабочего кода вообще никогда в жизни не доберусь, т.к. буду только заниматься тем, что подгонять тесты под ежедневно меняющиеся требования.

(no subject)

From: [identity profile] w00dy.livejournal.com - Date: 2010-08-04 11:19 am (UTC) - Expand

(no subject)

From: [identity profile] metaclass.livejournal.com - Date: 2010-08-04 11:22 am (UTC) - Expand

(no subject)

From: [identity profile] w00dy.livejournal.com - Date: 2010-08-04 11:41 am (UTC) - Expand

Date: 2010-08-04 11:18 am (UTC)
From: [identity profile] w00dy.livejournal.com
> Кстати, а что даст проверка "не поменялась ли база с последнего запуска sqlmetal"?

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

(no subject)

From: [identity profile] metaclass.livejournal.com - Date: 2010-08-04 11:23 am (UTC) - Expand

(no subject)

From: [identity profile] w00dy.livejournal.com - Date: 2010-08-04 11:45 am (UTC) - Expand

Date: 2010-08-04 11:13 am (UTC)
From: [identity profile] w00dy.livejournal.com
> Я знаю что такое Expression Trees и как они используются в Linq2Sql.

У вас однобокий взгляд на ситуацию. Я пользовал ORM DevExpress XPO. Он умеет по созданной структуре классов создать схему базы и обновлять с некоторыми ограничениями. У него есть Linq2Xpo провайдер, который много чего умеет выпихивать на сервер (группировки, join, фильтрацию, сортировки). В данном конкретном случае SRP банально соблюдён. Всеми вопросами хранения данных занимается ORM, а что за ним - не особо должно быть интересно (у лезть sql-ем в базу приходилось только когда делал какие-то масштабные апдейты схемы).

> Вы эти гриды видели?

Я не много их видел, а для win forms ещё меньше, но посмотрите на DevExpress. У них достаточно приличный грид, всё что вы написали вроде как умеет (группировку так точно, а кто такая люся лущик я не в курсе ;)

Date: 2010-08-04 12:03 pm (UTC)
From: [identity profile] asinitsyn.livejournal.com
>Он умеет по созданной структуре классов создать схему базы и обновлять с некоторыми ограничениями.

Увы, ОО модель программы не полностью соответствует даталогической модели. Поэтому для сколько-нибудь серьезного применения подобные ORM курят бамбук. Те, которые позволяют совместить правильную схему даннх с вашей правильной структурой классов - это хорошие, годные ORMы. Я таких не знаю.

Date: 2010-08-04 11:08 am (UTC)
From: [identity profile] zamotivator.livejournal.com
new Query ().Where (c => c.Name.StartWith ('i')).Select (c => new {c.Id, c.Name}) ;
Какой пиздец, а.
(deleted comment)
(deleted comment)

Re: Так лучше?

From: [identity profile] zamotivator.livejournal.com - Date: 2010-08-04 11:17 am (UTC) - Expand

Re: Так лучше?

From: [identity profile] asinitsyn.livejournal.com - Date: 2010-08-04 12:04 pm (UTC) - Expand

Re: Так лучше?

From: [identity profile] zamotivator.livejournal.com - Date: 2010-08-04 12:06 pm (UTC) - Expand

Re: Так лучше?

From: [identity profile] metaclass.livejournal.com - Date: 2010-08-04 12:08 pm (UTC) - Expand
(deleted comment)

Re: Так лучше?

From: [identity profile] metaclass.livejournal.com - Date: 2010-08-04 01:30 pm (UTC) - Expand
(deleted comment)

Re: Так лучше?

From: [identity profile] metaclass.livejournal.com - Date: 2010-08-04 01:55 pm (UTC) - Expand

Re: Так лучше?

From: [identity profile] asinitsyn.livejournal.com - Date: 2010-08-04 12:11 pm (UTC) - Expand

Re: Так лучше?

From: [identity profile] valgring.livejournal.com - Date: 2010-08-04 06:29 pm (UTC) - Expand

Re: Так лучше?

From: [identity profile] zamotivator.livejournal.com - Date: 2010-08-04 06:30 pm (UTC) - Expand

Re: Так лучше?

From: [identity profile] valgring.livejournal.com - Date: 2010-08-04 06:51 pm (UTC) - Expand

Date: 2010-08-04 11:12 am (UTC)
From: [identity profile] metaclass.livejournal.com
Не, в коде там более культурно выглядит:

from c in db.Customers
where c.Name="zhopnij ad"
select c.ID,c.Address

а вышеприведеннное это то же самое, но собранное руками, вместо монад :)

Date: 2010-08-04 11:13 am (UTC)
From: [identity profile] zamotivator.livejournal.com
from c in db.Customers
where c.Name="zhopnij ad"
select c.ID,c.Address

Зачем они запросы задом наперёд переписали?

Date: 2010-08-04 11:14 am (UTC)
From: [identity profile] metaclass.livejournal.com
Ну монада же. return в конце)

(no subject)

From: [identity profile] zamotivator.livejournal.com - Date: 2010-08-04 11:17 am (UTC) - Expand

(no subject)

From: [identity profile] metaclass.livejournal.com - Date: 2010-08-04 11:19 am (UTC) - Expand

(no subject)

From: [identity profile] zamotivator.livejournal.com - Date: 2010-08-04 11:23 am (UTC) - Expand

(no subject)

From: [identity profile] metaclass.livejournal.com - Date: 2010-08-04 11:25 am (UTC) - Expand

(no subject)

From: [identity profile] zamotivator.livejournal.com - Date: 2010-08-04 11:31 am (UTC) - Expand

(no subject)

From: [identity profile] metaclass.livejournal.com - Date: 2010-08-04 11:32 am (UTC) - Expand

(no subject)

From: [identity profile] zamotivator.livejournal.com - Date: 2010-08-04 11:32 am (UTC) - Expand

(no subject)

From: [identity profile] w00dy.livejournal.com - Date: 2010-08-04 11:49 am (UTC) - Expand

(no subject)

From: [identity profile] zamotivator.livejournal.com - Date: 2010-08-04 11:53 am (UTC) - Expand

(no subject)

From: [identity profile] w00dy.livejournal.com - Date: 2010-08-04 11:59 am (UTC) - Expand

(no subject)

From: [identity profile] asinitsyn.livejournal.com - Date: 2010-08-04 12:06 pm (UTC) - Expand

(no subject)

From: [identity profile] http://users.livejournal.com/_windwalker_/ - Date: 2010-08-04 06:18 pm (UTC) - Expand

Date: 2010-08-04 01:47 pm (UTC)
From: [identity profile] voidbent.livejournal.com
Толсто :)

Date: 2010-08-04 11:15 am (UTC)
From: [identity profile] w00dy.livejournal.com
имхо в функциональном виде выглядит оно явно приличней, посему в таком и не пишу никогда :)

Date: 2010-08-04 11:18 am (UTC)
From: [identity profile] metaclass.livejournal.com
Хм, я в голове как-то могу LINQ транслировать в выполняемый код, а вот обратно не могу :)

Date: 2010-08-04 11:29 am (UTC)
From: [identity profile] w00dy.livejournal.com
Ну а как правильно то?

Я это рассматриваю как конвеер (чем, по сути, это всё и является). По конвееру едут кортежи. Каждый этап это одна элементарная операция: фильтрация (Where), агрегация (GroupBy), слияние (Join), маппинг (Select), сортировка (OrderBy). В конце может стоять предикат (Any, All). Всё просто.

Date: 2010-08-04 11:32 am (UTC)
From: [identity profile] zamotivator.livejournal.com
Ну а как правильно то?
Правильно не выпендриваться с маргинальной хуйнёй, которая будет в моде год-другой, а писать обычный, тупой код - SQL, Perl/Python по вкусу.
(deleted comment)

(no subject)

From: [identity profile] zamotivator.livejournal.com - Date: 2010-08-04 11:45 am (UTC) - Expand
(deleted comment)

(no subject)

From: [identity profile] zamotivator.livejournal.com - Date: 2010-08-04 12:04 pm (UTC) - Expand

(no subject)

From: [identity profile] w00dy.livejournal.com - Date: 2010-08-04 03:16 pm (UTC) - Expand

(no subject)

From: [identity profile] zamotivator.livejournal.com - Date: 2010-08-04 04:19 pm (UTC) - Expand

(no subject)

From: [identity profile] w00dy.livejournal.com - Date: 2010-08-04 04:56 pm (UTC) - Expand

(no subject)

From: [identity profile] zamotivator.livejournal.com - Date: 2010-08-04 04:59 pm (UTC) - Expand

(no subject)

From: [identity profile] w00dy.livejournal.com - Date: 2010-08-04 05:25 pm (UTC) - Expand

(no subject)

From: [identity profile] zamotivator.livejournal.com - Date: 2010-08-04 05:26 pm (UTC) - Expand

(no subject)

From: [identity profile] w00dy.livejournal.com - Date: 2010-08-04 05:59 pm (UTC) - Expand

(no subject)

From: [identity profile] zamotivator.livejournal.com - Date: 2010-08-04 09:37 pm (UTC) - Expand

(no subject)

From: [personal profile] wizzard - Date: 2010-08-04 10:27 pm (UTC) - Expand

(no subject)

From: [identity profile] w00dy.livejournal.com - Date: 2010-08-04 10:50 pm (UTC) - Expand

(no subject)

From: [identity profile] zamotivator.livejournal.com - Date: 2010-08-04 10:58 pm (UTC) - Expand

(no subject)

From: [identity profile] zamotivator.livejournal.com - Date: 2010-08-04 10:56 pm (UTC) - Expand

(no subject)

From: [identity profile] thedeemon.livejournal.com - Date: 2010-08-05 01:39 am (UTC) - Expand

(no subject)

From: [identity profile] asinitsyn.livejournal.com - Date: 2010-08-04 12:10 pm (UTC) - Expand

Date: 2010-08-04 02:04 pm (UTC)
From: [identity profile] craneop.livejournal.com
C# вообще не кошерная вещь. Я к нему вообще прикасаться опасаюсь.

Date: 2010-08-05 11:19 pm (UTC)
From: [identity profile] anatoly borodin (from livejournal.com)
http://en.wiktionary.org/wiki/orm#Danish

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

Profile

metaclass: (Default)
metaclass

April 2017

S M T W T F S
      1
2345678
9101112 131415
16171819202122
23242526272829
30      

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jun. 8th, 2025 02:51 am
Powered by Dreamwidth Studios