[Ehum] HasFlags, HasNoFlags - что делать с default(T)?
От: Sinix  
Дата: 16.09.11 03:40
Оценка:
Предположим, у нас есть методы аля
    public static bool Includes(this AttributeTargets value, AttributeTargets flags)
    {
      return (value & flags) == flags;
    }
    public static bool Excludes(this AttributeTargets value, AttributeTargets flags)
    {
      return (value & flags) == 0;
    }
    public static bool IncludesAny(this AttributeTargets value, AttributeTargets flags)
    {
      return (value & flags) != 0;
    }
    public static bool ExcludesAny(this AttributeTargets value, AttributeTargets flags)
    {
      return (value & flags) != flags;
    }


Как быть в случае, когда flags == 0? Что должен возвращать Includes?

— True? Но тогда у нас a.Includes(0) == a.Excludes(0).
— Бросать ArgumentException? Придётся писать проверки аля if(flags != Flags.None && value.Includes(flags))
— Оставить как есть? Тоже чем-то не нравится

Что предложите?
Re: [Ehum] HasFlags, HasNoFlags - что делать с default(T)?
От: samius Япония http://sams-tricks.blogspot.com
Дата: 16.09.11 04:33
Оценка: 11 (1) +2
Здравствуйте, Sinix, Вы писали:

S>Предположим, у нас есть методы аля

S>
S>    public static bool Includes(this AttributeTargets value, AttributeTargets flags)
S>    {
S>      return (value & flags) == flags;
S>    }
S>


S>Как быть в случае, когда flags == 0? Что должен возвращать Includes?


S>- True? Но тогда у нас a.Includes(0) == a.Excludes(0).

S>- Бросать ArgumentException? Придётся писать проверки аля if(flags != Flags.None && value.Includes(flags))
S>- Оставить как есть? Тоже чем-то не нравится

S>Что предложите?

Если рассматривать отношение Includes как отношение подмножества флагов, то в соответствии с определением, пустое множество является подмножеством любого множества. То есть возвращать true.
Однако в примерах там же написано

The empty set, denoted by ∅, is also a subset of any given set X. (This statement is vacuously true.) The empty set is always a proper subset, except of itself.

т.е. если value == 0 и flags == 0, то false.

Однако, в русской вики такого уточнения нет. Откуда оно вообще следует — мне непонятно. Из определения вроде не вытекает.
Re[2]: [Ehum] HasFlags, HasNoFlags - что делать с default(T)
От: adontz Грузия http://adontz.wordpress.com/
Дата: 16.09.11 04:58
Оценка: +2
Здравствуйте, samius, Вы писали:

S>Однако в примерах там же написано

S>

S>The empty set, denoted by ∅, is also a subset of any given set X. (This statement is vacuously true.) The empty set is always a proper subset, except of itself.

S>т.е. если value == 0 и flags == 0, то false.
S>Однако, в русской вики такого уточнения нет. Откуда оно вообще следует — мне непонятно. Из определения вроде не вытекает.

Это глупость.

Пустое_множество
Пустое множество является подмножеством любого множества. Иначе говоря, и, в частности,
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[3]: [Ehum] HasFlags, HasNoFlags - что делать с default(T)
От: Sinix  
Дата: 16.09.11 05:00
Оценка:
Здравствуйте, adontz, Вы писали:

A>Пустое множество является подмножеством любого множества.

Ок. Чему тогда должно быть равно Excludes(value,0)?
Re[4]: [Ehum] HasFlags, HasNoFlags - что делать с default(T)
От: adontz Грузия http://adontz.wordpress.com/
Дата: 16.09.11 05:05
Оценка: 22 (1)
Здравствуйте, Sinix, Вы писали:

A>>Пустое множество является подмножеством любого множества.

S>Ок. Чему тогда должно быть равно Excludes(value,0)?

0 exclude 0 == false.

Я думаю это должно быть так, ещё и потому что для любых a,b должно выполнятся Includes(a,b) == !Excludes(a,b). А вот Includes(a,b) == !Includes(b,a) не должно выполнятся, потому что множество (не только пустое) является собственным подмножеством.
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[2]: [Ehum] HasFlags, HasNoFlags - что делать с default(T)
От: adontz Грузия http://adontz.wordpress.com/
Дата: 16.09.11 05:07
Оценка:
Здравствуйте, samius, Вы писали:

S>Однако в примерах там же написано

S>

S>The empty set, denoted by ∅, is also a subset of any given set X. (This statement is vacuously true.) The empty set is always a proper subset, except of itself.

S>т.е. если value == 0 и flags == 0, то false.

Нет, не глупость, это я английский не знаю. The empty set is always a proper subset, except of itself.
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[3]: [Ehum] HasFlags, HasNoFlags - что делать с default(T)
От: samius Япония http://sams-tricks.blogspot.com
Дата: 16.09.11 05:09
Оценка:
Здравствуйте, adontz, Вы писали:

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


S>>Однако в примерах там же написано

S>>

S>>The empty set, denoted by ∅, is also a subset of any given set X. (This statement is vacuously true.) The empty set is always a proper subset, except of itself.

S>>т.е. если value == 0 и flags == 0, то false.

A>Нет, не глупость, это я английский не знаю. The empty set is always a proper subset, except of itself.

Проблема в том, что это утверждение — пример, а не часть определения. Откуда следует что оно не является подмножеством себя (пустого множества)?
Re[4]: [Ehum] HasFlags, HasNoFlags - что делать с default(T)
От: adontz Грузия http://adontz.wordpress.com/
Дата: 16.09.11 05:11
Оценка: 16 (1)
Здравствуйте, samius, Вы писали:

A>>Нет, не глупость, это я английский не знаю. The empty set is always a proper subset, except of itself.

S>Откуда следует что оно не является подмножеством себя (пустого множества)?

Вообще-то, там написано что оно не является нетривиальным подмножеством самого себя.
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[5]: [Ehum] HasFlags, HasNoFlags - что делать с default(T)
От: samius Япония http://sams-tricks.blogspot.com
Дата: 16.09.11 05:17
Оценка:
Здравствуйте, adontz, Вы писали:

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


A>>>Нет, не глупость, это я английский не знаю. The empty set is always a proper subset, except of itself.

S>>Откуда следует что оно не является подмножеством себя (пустого множества)?

A>Вообще-то, там написано что оно не является нетривиальным подмножеством самого себя.


+1
http://oxforddictionaries.com/definition/proper;

Mathematics denoting a subset or subgroup that does not constitute the entire set or group, especially one that has more than one element.

Re: [Ehum] HasFlags, HasNoFlags - что делать с default(T)?
От: AlexNek  
Дата: 17.09.11 08:44
Оценка: 22 (1) +1
Здравствуйте, Sinix, Вы писали:

S> Предположим, у нас есть методы аля

...

S> Как быть в случае, когда flags == 0? Что должен возвращать Includes?


S> — True? Но тогда у нас a.Includes(0) == a.Excludes(0).

S> — Бросать ArgumentException? Придётся писать проверки аля if(flags != Flags.None && value.Includes(flags))
S> — Оставить как есть? Тоже чем-то не нравится

S> Что предложите?

А почему бы флаг None не считать таким же равноправным флагом как и остальные (если исключить комбинации типа FlagX | None)?
тогда Includes должен возвращать true когда флаг "установлен" (value = 0)
а Excludes должен возвращать true когда флаг "не установлен". (value != 0) Соответственно Excludes(0,None) будет false
avalon 1.0rc3 rev 419, zlib 1.2.3
Re: [Ehum] HasFlags, HasNoFlags - что делать с default(T)?
От: Lloyd Россия  
Дата: 17.09.11 14:01
Оценка:
Здравствуйте, Sinix, Вы писали:

S>Что предложите?


Не использовать 0 в кач-ве валидного значения флага.
Re[2]: [Ehum] HasFlags, HasNoFlags - что делать с default(T)
От: Sinix  
Дата: 17.09.11 14:19
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>Не использовать 0 в кач-ве валидного значения флага.


Ок, т.е. ваш голос — за то, чтобы бросать исключение?

Методы на самом деле имеют сигнатуру Includes<T>, None присутствует в куче enum-ов BCL — на вход всегда может прийти 0 и с этим я не могу ничего поделать.
Re[3]: [Ehum] HasFlags, HasNoFlags - что делать с default(T)
От: Lloyd Россия  
Дата: 17.09.11 15:18
Оценка:
Здравствуйте, Sinix, Вы писали:

L>>Не использовать 0 в кач-ве валидного значения флага.


S>Ок, т.е. ваш голос — за то, чтобы бросать исключение?


Мой голос за то, чтобы в объявлении enum-а не было нулевых значений.

S>Методы на самом деле имеют сигнатуру Includes<T>, None присутствует в куче enum-ов BCL — на вход всегда может прийти 0 и с этим я не могу ничего поделать.


Про Includes для пустого множества тут уже написали.
Re[2]: [Ehum] HasFlags, HasNoFlags - что делать с default(T)
От: Аноним  
Дата: 17.09.11 20:09
Оценка:
Здравствуйте, samius, Вы писали:

S>Если рассматривать отношение Includes как отношение подмножества флагов, то в соответствии с определением, пустое множество является подмножеством любого множества. То есть возвращать true.

S>Однако в примерах там же написано
S>

S>The empty set, denoted by ∅, is also a subset of any given set X. (This statement is vacuously true.) The empty set is always a proper subset, except of itself.

S>т.е. если value == 0 и flags == 0, то false.

S>Однако, в русской вики такого уточнения нет. Откуда оно вообще следует — мне непонятно. Из определения вроде не вытекает.


По-моему, пустое множество — это специальный случай, который вы можете определить как вам удобно, если при этом не возникает противоречий.

1) Пустое множество не является подмножеством любого множества и не является подмножеством себя.
2) Пустое множество является подмножеством любого множества и является подмножеством себя.
Re[3]: [Ehum] HasFlags, HasNoFlags - что делать с default(T)
От: samius Япония http://sams-tricks.blogspot.com
Дата: 17.09.11 20:30
Оценка:
Здравствуйте, Аноним, Вы писали:

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


А>По-моему, пустое множество — это специальный случай, который вы можете определить как вам удобно, если при этом не возникает противоречий.


А>1) Пустое множество не является подмножеством любого множества и не является подмножеством себя.

А>2) Пустое множество является подмножеством любого множества и является подмножеством себя.
Если я буду определять множество как мне удобно, то оно не будет являться общепринятым множеством и не будет обладать свойствами общепринятого понятия множество. Определение включения перестанет работать, его придется определять тоже по-своему. Может оно будет и удобно, но называть получившийся объект термином "множество" будет уже не очень удобно, т.к. окружающие будут введены в заблуждение.

А чем может быть удобнее пустое множество, не являющееся подмножеством себя?
Re[4]: [Ehum] HasFlags, HasNoFlags - что делать с default(T)
От: Аноним  
Дата: 17.09.11 20:49
Оценка:
Здравствуйте, samius, Вы писали:

S>Если я буду определять множество как мне удобно, то оно не будет являться общепринятым множеством и не будет обладать свойствами общепринятого понятия множество. Определение включения перестанет работать, его придется определять тоже по-своему. Может оно будет и удобно, но называть получившийся объект термином "множество" будет уже не очень удобно, т.к. окружающие будут введены в заблуждение.


S>А чем может быть удобнее пустое множество, не являющееся подмножеством себя?


Мне казалось, что в математике "общепринятость" обеспечивается автоматически логической правильностью. Если что-то логически корректно, можно считать, что это общепринято. Интересно, что многие люди любят воспринимать математику как набор догм.

Строго говоря, для пустого множества отношение "включения" не определено. Для него, в принципе, нельзя сказать, включается оно в другие множества, или нет, потому как этот случай выходит за рамки определения подмножества для непустых множеств.

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

Таким образом, можно логически корректно определить отношение включения для подмножества для всех трех типов результатов: false, true и null (последний, вообще говоря, самый правильный и самый неудобный при этом).
Re[5]: [Ehum] HasFlags, HasNoFlags - что делать с default(T)
От: samius Япония http://sams-tricks.blogspot.com
Дата: 17.09.11 21:45
Оценка: +1
Здравствуйте, Аноним, Вы писали:

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


S>>Если я буду определять множество как мне удобно, то оно не будет являться общепринятым множеством и не будет обладать свойствами общепринятого понятия множество. Определение включения перестанет работать, его придется определять тоже по-своему. Может оно будет и удобно, но называть получившийся объект термином "множество" будет уже не очень удобно, т.к. окружающие будут введены в заблуждение.


S>>А чем может быть удобнее пустое множество, не являющееся подмножеством себя?


А>Мне казалось, что в математике "общепринятость" обеспечивается автоматически логической правильностью. Если что-то логически корректно, можно считать, что это общепринято.

Это не так. Общепринятость может опираться на допущения. Например на то, что параллельные прямые не пересекаются. Это логически корректно?
А>Интересно, что многие люди любят воспринимать математику как набор догм.

А>Строго говоря, для пустого множества отношение "включения" не определено. Для него, в принципе, нельзя сказать, включается оно в другие множества, или нет, потому как этот случай выходит за рамки определения подмножества для непустых множеств.

Отношение включения для пустого множества напрямую вытекает из определения отношения включения.

А>Но поскольку рассматривать этот специальный случай при каждом вычислении отдельно было бы неудобно, считают, что пустое множество включено во все множества (отсюда следует, что оно является подмножеством самого себя). Это не вызывает логических противоречий и математиков устраивает.


А>Таким образом, можно логически корректно определить отношение включения для подмножества для всех трех типов результатов: false, true и null (последний, вообще говоря, самый правильный и самый неудобный при этом).

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

Почему бы и нет? Просто это будет "другая" математика множеств. Но ее полезность мне сложно оценить. А раз польза сомнительна, то зачем отклоняться от общепринятых понятий?
Re[6]: [Ehum] HasFlags, HasNoFlags - что делать с default(T)
От: Аноним  
Дата: 17.09.11 22:06
Оценка:
Здравствуйте, samius, Вы писали:

S>Общепринятость может опираться на допущения. Например на то, что параллельные прямые не пересекаются. Это логически корректно?


Не вижу здесь отрицания моего утверждения. Геометрия Лобачевского такая же общепринятая математика, весь вопрос в ее полезности в применении к конкретной задаче.

S>Отношение включения для пустого множества напрямую вытекает из определения отношения включения.


Как именно? Отношение включения определяется (можно определить) как: "A содержит B, если все элементы B являются элементами A". Если B — пустое множество, в нем нет элементов, и это определение неприменимо.

А>>Таким образом, можно логически корректно определить отношение включения для подмножества для всех трех типов результатов: false, true и null (последний, вообще говоря, самый правильный и самый неудобный при этом).

S>Только для такой логической корректности нужно будет изменить определение отношения включения. После чего оно просто перестанет быть общепринятым. Нарушатся общеизвестные свойства пустого множества: например, оно перестанет быть нейтральным относительно объединения.

Почему оно перестанет быть нейтральным?
Re[7]: [Ehum] HasFlags, HasNoFlags - что делать с default(T)
От: Lloyd Россия  
Дата: 17.09.11 22:37
Оценка:
Здравствуйте, Аноним, Вы писали:

S>>Отношение включения для пустого множества напрямую вытекает из определения отношения включения.


А>Если B — пустое множество, в нем нет элементов, и это определение неприменимо.


Почему?
Re[7]: [Ehum] HasFlags, HasNoFlags - что делать с default(T)
От: samius Япония http://sams-tricks.blogspot.com
Дата: 18.09.11 04:24
Оценка:
Здравствуйте, Аноним, Вы писали:

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


S>>Общепринятость может опираться на допущения. Например на то, что параллельные прямые не пересекаются. Это логически корректно?


А>Не вижу здесь отрицания моего утверждения.

Я привел пример того, что общепринятая математика может быть построена на допущении, а не на логически корректном утверждении.
А>Геометрия Лобачевского такая же общепринятая математика, весь вопрос в ее полезности в применении к конкретной задаче.
Общепринятой считается геометрия Евклида, и подразумевая другую геометрию, обычно оговаривают этот факт специально. Вы же пытаетесь манипулировать терминами, определениями и их следствиями, делая их удобными для вас. Но окружающие в то же время остаются убежденными что имеют дело с общепринятыми понятиями.

S>>Отношение включения для пустого множества напрямую вытекает из определения отношения включения.


А>Как именно? Отношение включения определяется (можно определить) как: "A содержит B, если все элементы B являются элементами A".

Именно так оно и определено. Если вы его определите по-другому, то это будет другое отношение.

А>Если B — пустое множество, в нем нет элементов, и это определение неприменимо.

Очень даже применимо, если знать что подразумевает "все" и не пытаться подставлять свои понятия.

А>>>Таким образом, можно логически корректно определить отношение включения для подмножества для всех трех типов результатов: false, true и null (последний, вообще говоря, самый правильный и самый неудобный при этом).

S>>Только для такой логической корректности нужно будет изменить определение отношения включения. После чего оно просто перестанет быть общепринятым. Нарушатся общеизвестные свойства пустого множества: например, оно перестанет быть нейтральным относительно объединения.

А>Почему оно перестанет быть нейтральным?

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