public по умолчанию для свойств
От: VladD2 Российская Империя www.nemerle.org
Дата: 23.11.11 12:30
Оценка:
Всем привет.

Тема Значения по умолчанию для модификаторов видимости
Автор: VladD2
Дата: 22.11.11
показала, что большинство отрицательно относится к изменению умолчаний для модификаторов видимости полей и к зависимости умолчания от типа поля (изменяемое/неизменяемое).

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

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

Такое умолчание может разгрузить описание типов. Особенно тех что используются как записи (с макросом рекорд и почти без методов).

Как вам эта идея?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: public по умолчанию для свойств
От: _Claus_  
Дата: 23.11.11 13:18
Оценка:
CodingUnit> Я уже писал подобный макрос, можно его указывать перед частью объявлений как в C++, (при желании можно сделать на уровне типов, и на уровне сборок). Это позволяет вручную контролировать семантику и не писать нудные повторяющиеся модификаторы для группы объявлений. Владу не понравился синтаксис, неочевидно что после макроса видимость другая. Проблемы с синтаксисом нет на уровне типов, проблемы же с синтаксисом в классе наверное можно решить в Н2, если будет возможность указать специальный синтаксис для этого макроса. А так можно юзать это решит обе проблемы, упростить ввод повторяющихся модификаторов, и не менять умолчания в существующих проектах.
Кому интересно, примерный код макроса можно посмотреть здесь: https://github.com/CodingUnit/CommonLib/blob/master/CommonLib/CommonLib.Nemerle/CommonLib.Macros/Visibility.n

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

По поводу макроса круче конечно его вешать на уровень сборки. такое возможно? а то в одном месте отнимаем, в другом прибавляем, выгода не очевидна.
Re[2]: public по умолчанию для свойств
От: _nn_ www.nemerleweb.com
Дата: 23.11.11 13:26
Оценка:
Здравствуйте, _Claus_, Вы писали:

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


http://rsdn.ru/article/nemerle/MacrosExtCoursePart3.xml
Автор(ы): Чистяков Влад (VladD2)
Дата: 05.02.2008
В третьей части статьи о макросах Nemerle речь пойдет о разработке метаатрибутов, то есть макросов, которые выглядят как Custom-атрибуты.


К чему применимы метаатрибуты?

Как и простые пользовательские (custom) атрибуты, метаатрибуты могут быть применены к разным элементам кода. За то, к чему применим метаатрибут, отвечает перечисление MacroTargets, которое реально является синонимом для стандартного .NET-перечисления System.AttributeTargets. Но не все значения этого перечисления допустимы для метаатрибутов. Ниже перечислены допустимые значения:

  • Class – атрибут применим к любому типу, в том числе к интерфейсам, перечислениям, вариантам и делегатам. Зато значения Module, Struct, Enum, Interface, Delegate использоваться в качестве типа метаатрибута не могут. Если вы хотите создать метаатрибут, который будет применим, скажем, только к интерфейсам, вы можете узнать, что за тип компилируется через передаваемый метаатрибуту экземпляр TypeBuilder-а.
  • Method – атрибут применим к методам и accessor-ам свойств.
  • Field – атрибут применим к полям типов.
  • Property – атрибут применим к свойствам.
  • Event – атрибут применим к событиям.
  • Parameter – атрибут применим к параметрам методов.
  • Assembly – атрибут применим к сборке (т.е. является глобальным атрибутом).
  • http://rsdn.nemerleweb.com
    http://nemerleweb.com
    Re[2]: public по умолчанию для свойств
    От: artelk  
    Дата: 23.11.11 13:36
    Оценка:
    Здравствуйте, _Claus_, Вы писали:

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


    Думаю, можно сделать и такие макроатрибуты (для любителей C++ ):
    class Test
    {
     [Public]//секция public
      F1():void{}
      F2():void{}
    
     [Private]//секция private
      x: int;
      y: int;
    }

    С небольшим шаманством в коде макроса, связанным с определением позиции макроса и членов класса.
    Re[3]: public по умолчанию для свойств
    От: _Claus_  
    Дата: 23.11.11 13:47
    Оценка:
    __>К чему применимы метаатрибуты?

    __>Как и простые пользовательские (custom) атрибуты, метаатрибуты могут быть применены к разным элементам кода. За то, к чему применим метаатрибут, отвечает перечисление MacroTargets, которое реально является синонимом для стандартного .NET-перечисления System.AttributeTargets. Но не все значения этого перечисления допустимы для метаатрибутов. Ниже перечислены допустимые значения:...


    это я уже знаю. но я интересуюсь возможными граблями. как вот попытался я сделать smart — макрос для = , а оказывается нельзя.
    так вот здесь есть "нельзя"? можно в принципе написать один макрос, который, примененный через using .. , будет делать умолчания public-ами?
    Re[4]: public по умолчанию для свойств
    От: _nn_ www.nemerleweb.com
    Дата: 23.11.11 13:52
    Оценка:
    Здравствуйте, _Claus_, Вы писали:

    __>>К чему применимы метаатрибуты?


    __>>Как и простые пользовательские (custom) атрибуты, метаатрибуты могут быть применены к разным элементам кода. За то, к чему применим метаатрибут, отвечает перечисление MacroTargets, которое реально является синонимом для стандартного .NET-перечисления System.AttributeTargets. Но не все значения этого перечисления допустимы для метаатрибутов. Ниже перечислены допустимые значения:...


    _C_>это я уже знаю. но я интересуюсь возможными граблями. как вот попытался я сделать smart — макрос для = , а оказывается нельзя.

    Для "$" и подозреваю для "." нельзя макрос сделать.
    Есть где-то ограничения расширяемости.
    Разве что, есть время и желание это улучшить

    _C_>так вот здесь есть "нельзя"? можно в принципе написать один макрос, который, примененный через using .. , будет делать умолчания public-ами?

    Тут ведь то разные типы макросов.
    Синтаксические макросы и макроатрибуты.
    У макроатрибутов совсем другие правила и они могут работать на более ранних стадиях, т.е. могут менять private на public и т.п.
    http://rsdn.nemerleweb.com
    http://nemerleweb.com
    Re[3]: public по умолчанию для свойств
    От: _Claus_  
    Дата: 23.11.11 13:56
    Оценка:
    Здравствуйте, artelk, Вы писали:

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


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


    A>Думаю, можно сделать и такие макроатрибуты (для любителей C++ ):

    A>
    A>class Test
    A>{
    A> [Public]//секция public
    A>  F1():void{}
    A>  F2():void{}
    
    A> [Private]//секция private
    A>  x: int;
    A>  y: int;
    A>}
    A>

    A>С небольшим шаманством в коде макроса, связанным с определением позиции макроса и членов класса.

    имхо намного умнее было бы сделать опцию компилятора, которая по умолчанию считала бы свойства и методы пабликами.
    все были бы удовлетворены.
    Re[4]: public по умолчанию для свойств
    От: artelk  
    Дата: 23.11.11 13:57
    Оценка: +1
    Здравствуйте, _Claus_, Вы писали:

    _C_>можно в принципе написать один макрос, который, примененный через using .. , будет делать умолчания public-ами?


    Через using макрос применить нельзя. Можно для каждой отдельной сборки:
    [assembly:UseMySuperPuperDefaultVisibilityStrategy]
    Re[4]: public по умолчанию для свойств
    От: artelk  
    Дата: 23.11.11 14:01
    Оценка:
    Здравствуйте, _Claus_, Вы писали:

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

    _C_>все были бы удовлетворены.

    Кстати, идея и вопрос бывалым: а можно ли научить компилятор, чтобы в командной строке можно было указывать какие макроатрибуты уровня сборки применить?
    Re[4]: public по умолчанию для свойств
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 23.11.11 14:47
    Оценка:
    Здравствуйте, _Claus_, Вы писали:

    _C_>так вот здесь есть "нельзя"? можно в принципе написать один макрос, который, примененный через using .. , будет делать умолчания public-ами?


    Да, можно, можно. Главное в этом макросе не трогать типы сгенерированные другими макросами.
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[4]: public по умолчанию для свойств
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 23.11.11 14:49
    Оценка:
    Здравствуйте, _Claus_, Вы писали:

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

    _C_>все были бы удовлетворены.

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

    ЗЫ

    Для тех кто не понял — это была злобная ирония.
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[5]: public по умолчанию для свойств
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 23.11.11 14:50
    Оценка:
    Здравствуйте, artelk, Вы писали:

    A>Кстати, идея и вопрос бывалым: а можно ли научить компилятор, чтобы в командной строке можно было указывать какие макроатрибуты уровня сборки применить?


    Научить то можно чему угодно. Вопрос нужно ли это делать. Намного умнее завести файл с нужными атрибутами и добавлять его к нужным проектам. И менять ничего не надо, и люди будут понимать что происходит.
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[5]: public по умолчанию для свойств
    От: _Claus_  
    Дата: 23.11.11 15:15
    Оценка:
    VD>Ну, да. Только потом не забывать прикладывать опции компилятора к каждому исходнику. А то ведь без них смысл кода понять будет нельзя.
    это почему нельзя? опция

    default_method_visible:public

    вполне читабельна и понятна. даже в исходник компилятора не смотри (не смотря).
    Re[2]: public по умолчанию для свойств
    От: CodingUnit Россия  
    Дата: 23.11.11 15:35
    Оценка:
    Здравствуйте, _Claus_, Вы писали:

    _C_>CodingUnit> Я уже писал подобный макрос, можно его указывать перед частью объявлений как в C++, (при желании можно сделать на уровне типов, и на уровне сборок). Это позволяет вручную контролировать семантику и не писать нудные повторяющиеся модификаторы для группы объявлений. Владу не понравился синтаксис, неочевидно что после макроса видимость другая. Проблемы с синтаксисом нет на уровне типов, проблемы же с синтаксисом в классе наверное можно решить в Н2, если будет возможность указать специальный синтаксис для этого макроса. А так можно юзать это решит обе проблемы, упростить ввод повторяющихся модификаторов, и не менять умолчания в существующих проектах.

    _C_>Кому интересно, примерный код макроса можно посмотреть здесь: https://github.com/CodingUnit/CommonLib/blob/master/CommonLib/CommonLib.Nemerle/CommonLib.Macros/Visibility.n

    _C_>Вот хорошее компромиссное решение, если общество против. хотя зачем быть против, если писать все можно как и раньше и код переделывать не надо, мне не совсем понятно.


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


    Уровня сборки можно, это только дело техники, мне нужно было сначала получить семантику С++, а идею легко перенести и до уровня сборки, ограничений я здесь не вижу.
    Re[3]: public по умолчанию для свойств
    От: CodingUnit Россия  
    Дата: 23.11.11 15:39
    Оценка:
    Здравствуйте, artelk, Вы писали:

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


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


    A>Думаю, можно сделать и такие макроатрибуты (для любителей C++ ):

    A>
    A>class Test
    A>{
    A> [Public]//секция public
    A>  F1():void{}
    A>  F2():void{}
    
    A> [Private]//секция private
    A>  x: int;
    A>  y: int;
    A>}
    A>

    A>С небольшим шаманством в коде макроса, связанным с определением позиции макроса и членов класса.

    Вот это именно то что и делает точно тот макрос, что я привел, только синтаксис чуть иной [Visibility(Public)]. Сообщество год назад меня с этой идеей на смех подняло, я теперь сами пришли.
    Re[3]: public по умолчанию для свойств
    От: _Claus_  
    Дата: 23.11.11 15:43
    Оценка:
    CU>Уровня сборки можно, это только дело техники, мне нужно было сначала получить семантику С++, а идею легко перенести и до уровня сборки, ограничений я здесь не вижу.
    какую именно семантику? мы вроде здесь толкуем об умолчаниях для свойств и методов Nemerle-классов.
    Re[4]: public по умолчанию для свойств
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 23.11.11 15:44
    Оценка: 2 (1) :)
    Здравствуйте, _Claus_, Вы писали:

    _C_>это я уже знаю. но я интересуюсь возможными граблями. как вот попытался я сделать smart — макрос для = , а оказывается нельзя.

    _C_>так вот здесь есть "нельзя"? можно в принципе написать один макрос, который, примененный через using .. , будет делать умолчания public-ами?

    Блин, отвлекаете от работы на разную фигню.

    Вот тебе макрос для любителей С++. Позволяет писать так:
    module Program
    {
    cpp public;
    
      Test() : void { }
      Field : int = 1;
    
      private Main() : void
      {
        _ = ReadLine();
      }
    }


    Развлекайся:
    [MacroUsage(MacroPhase.BeforeInheritance, MacroTargets.Method)]
    macro CppPublic(typeBuilder : TypeBuilder, _method : ClassMember.Function)
    syntax ("cpp", "public") 
    {
      CppPublicImpl.DoTransform(Macros.ImplicitCTX(), typeBuilder)
    }
      
    module CppPublicImpl
    {
      public DoTransform(typer : Typer, typeBuilder : TypeBuilder) : void
      {
        Macros.DefineCTX(typer);
          
        def curLoc    = LocationStack.Top(); // местоположение нашего макроса
        def fileIndex = curLoc.FileIndex;
        def members   = typeBuilder.AstParts
                        .First(ast => ast.Location.FileIndex == fileIndex) // фильтруем AST-part нашего файла
                        .GetMembers() // получаем AST членов
                        // фильтруем члены что идут после макроса и не имеют явно заданного модификатора доступа
                        .Where(m => m.Location.Begin > curLoc.End && !(m.Attributes %&& NemerleModifiers.AccessModifiers));
                          
        foreach (member in members)
          member.Attributes = NemerleModifiers.Public;
      }
    }


    В Н2 можно будет вообще полностью повторить синтаксис C++ и реализовать "лэйбл":

    module Program
    {
    public:
    
      Test() : void { }
      Field : int = 1;
    
      private Main() : void
      {
        _ = ReadLine();
      }
    }


    ЗЫ

    Вот будет раздолье маньякам!
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[4]: public по умолчанию для свойств
    От: CodingUnit Россия  
    Дата: 23.11.11 15:44
    Оценка: 51 (1)
    Здравствуйте, _Claus_, Вы писали:

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

    _C_>все были бы удовлетворены.

    Макрос и является безопасным расширением компилятора, и делает это более явно и безопасно. Шаманство с опциями начинает затрагивать всех пользователей компилятора, на каждую функцию включать выключать, становится неудобно юзать сам компилятор, тем более что сейчас нет возможности добавить какую угодно опцию в visual studio к командной строке, без дописывания специальных диалогов или правки msbuild скриптов. Мне кажется такие эксперименты для начала лучше делать макросами, а потом после практики использования функции думать о ее применении хардкодом компилятора.
    Re[4]: public по умолчанию для свойств
    От: CodingUnit Россия  
    Дата: 23.11.11 15:51
    Оценка:
    Здравствуйте, _Claus_, Вы писали:


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

    _C_>какую именно семантику? мы вроде здесь толкуем об умолчаниях для свойств и методов Nemerle-классов.

    Это ответ на твой вопрос умолчания для модификаторов, в С++ как известно после слова public: все члены идут public, это и есть его поведение (семантика). Макрос работает так, если его объявить перед группой методов они становятся public, есть ключ Explicit который трогает только те члены которые не указаны явно. Это воркэраунд для любителей заменить поведение по умолчанию для членов, макрос как заготовка.
    Re[5]: public по умолчанию для свойств
    От: _Claus_  
    Дата: 23.11.11 15:52
    Оценка:
    VD>Вот тебе макрос для любителей С++. Позволят писать так:
    ...
    VD>Вот будет раздолье маньякам!

    Спасибо! Но я вообще за С++ молчал. я хотел глобальное определение на умолчания
    Больше постараюсь не отвлекать.
    Подождите ...
    Wait...
    Пока на собственное сообщение не было ответов, его можно удалить.