All streams
Search
Write a publication
Pull to refresh
6
0
Send message

Про новые возможности Windows 11. Решил проверить а что нового в API, может есть что-то новое и интересное в WinAPI? Если коротко - ничего нет.

Снял Dll дампы системных библиотек для Windows 10 и 11 (kernel32, user32, advapi32, wsock32). Разница абсолютно минимальная. Единственное, что меня удивило, так это удаление некоторых функций, но их не много, хотя, как по мне, нарушение обратной совместимости.

На всякий случай, список экспортированных функций: https://disk.yandex.ru/d/aaF-qgXB1GZqfA

Получается, что кроме интерфейсных изменений, ничего больше и нет.

Науке мало интересны «истинная сущность» человеческой души или, даже, просто чисел.

Вот и мне кажется, что ученый не задающийся иногда вопросами вида: «В чем смысл чисел?», «Почему появились числа», «Как так получилось, что простое пересчитывание тушек убитых животных, превратилось в отдельный, сложный раздел математики?», много теряет, по сути превращается в инженера от науки. Я уверен, что большинство великих ученых, тот же Хокинг, задавались подобными вопросами.
Запрос это правильно! )
Ну а минусы, да бог с ними.
Вот я все хочу написать пару статей (профильных), а дальше:
Только что-то струна порвалась…
Да сломалось перо…
Вредно, конечно нет, любой разумный человек принимает решения сам.
Про пиар на хайпе — мне так показалось, но я не настаиваю, извиняюсь если у Вас не было таких целей.
Не профильно — 100% процентов.
Дело в том, что это IT ресурс, вряд ли тут достаточное кол-во специалистов, которые в состоянии качественно проанализировать приведенную информацию, т.е. иммунологов, микробиологов и (я как программист) даже не знаю как еще называются профильные специализации. Кроме того, портянка очень длинная, система подбора информации не ясна, по крайней мере мне, интуитивно кажется, что это салат из надерганной где попало информации. А тема актуальная, и для потерявших своих близких, или больных, например, заболеваниями крови.
Собственно отсюда и вывод, ресурс не профильный, доводы не ясны, критериев оценки нет, подача сомнительная (как мне показалось), тема актуальная — в общем, очки на болезненной теме.
Ну и по факту, у меня не так много знакомых умирало раньше, а в этом году уже трое именно, от короны. Можно возразить, что они попали под машину, инфаркт и бог знает что еще, а врачи списывают, но — двое из них семейные пары, жены выжили, а мужья нет. Поймите, это я не страсти пытаюсь навести, это мои личные наблюдения. И да, я мне не платит Спутник, Пфайзер и т.д. и вообще я никого ни к чему не призываю, каждый принимает решения для себя.
Отвратительная тенденциозная статья ни о чем. Не в том месте, не в то время.
Подозрение на спекуляцию на теме.
Поменяйте ETL на что-нибудь другое. Люди из мира хранилищ данных вас не поймут, все таки это совсем совсем другое.
Например Result это, в том числе, имя псевдо переменной в функциях, и вообще слишком обобщенное название, если так называть глобальные идентификаторы, будет много путаницы. Поэтому в Паскале обычно используют длинные названия типов, например — TResultMonad. Но лично мне больше нравятся неймспейсы.
Модулей нет, есть Юниты, можно сделать юнит Monad. Но это совершенно не обязывает указывать его в наименовании, т.е. в данном примере Result станет глобальным именем.
Попробовал реализовать подход с монадами, на основе перегрузки операторов. Мне кажется результат лаконичнее чем на основе наследования.
Код на Паскале, но думаю перевести его C# не составит труда.

Определение монады на основе Record (Value type в терминологии .Net):
type
  Monad = class sealed
  public type
    Result<TSuccess, TFailure> = record
    private
      FIsSuccess: Boolean;
      FSuccess: TSuccess;
      FFailure: TFailure;
    public
      class function Success(const Value: TSuccess): Result<TSuccess, TFailure>; static; inline;
      class function Failure(const Value: TFailure): Result<TSuccess, TFailure>; static; inline;
    public
      class operator Implicit(const R: Result<TSuccess, TFailure>): Boolean; static; inline;
      class operator Explicit(const R: Result<TSuccess, TFailure>): TSuccess; static; inline;
      class operator Explicit(const R: Result<TSuccess, TFailure>): TFailure; static; inline;
    end;
  end;


Идея в том, что тип Monad.Result реализует неявное преобразование к Boolean в зависимости от успеха операции. И явное преобразование в типы TSuccess и TFailure.
Обертка в класс Monad — костыль для красоты именования, т.к. нормальных Namespace в Delphi так и не сделали.

Реализация:
class function Monad.Result<TSuccess, TFailure>.Success(const Value: TSuccess): Result<TSuccess, TFailure>;
begin
  Result.FIsSuccess := True;
  Result.FSuccess := Value;
end;

class function Monad.Result<TSuccess, TFailure>.Failure(const Value: TFailure): Result<TSuccess, TFailure>;
begin
  Result.FIsSuccess := False;
  Result.FFailure := Value;
end;

class operator Monad.Result<TSuccess, TFailure>.Explicit(const R: Result<TSuccess, TFailure>): TFailure;
begin
  if R.FIsSuccess then
    raise Exception.Create('Invalid cast for success');

  Result := R.FFailure;
end;

class operator Monad.Result<TSuccess, TFailure>.Explicit(const R: Result<TSuccess, TFailure>): TSuccess;
begin
  if not R.FIsSuccess then
    raise Exception.Create('Invalid cast for failure');

  Result := R.FSuccess;
end;

class operator Monad.Result<TSuccess, TFailure>.Implicit(const R: Result<TSuccess, TFailure>): Boolean;
begin
  Result := R.FIsSucces;
end;


Реализация метода:
function GetUser(const Id: string): Monad.Result<TUser, string>;
begin
  if UserStorage.DefaultUser.Id = Id then
    Result := Monad.Result<TUser, string>.Success(UserStorage.DefaultUser)
  else
    Result := Monad.Result<TUser, string>.Failure('User no found');
end;

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

Использование:
procedure Test;
var
  Result: Monad.Result<TUser, string>;
begin
  Result := GetUser(1);

  if Result then
    WriteLn(TUser(Result).Name)
  else
    WriteLn(string(Result));
end;


Из недостатков такого подхода – возвращаемые типы для успеха и не успеха не должны совпадать, т.к. результат приведения типа будет не определен. Тоже и для типа Boolean — будет конфликт с неявным приведением.

Information

Rating
Does not participate
Registered
Activity