Гость
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Нельзя описывать методы с одинаковыми сигнатурами. / 25 сообщений из 35, страница 1 из 2
29.09.2015, 18:12
    #39064540
ProBiotek
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нельзя описывать методы с одинаковыми сигнатурами.
Привет.

Нельзя описывать методы с одинаковой сигнатурой.
Но вот есть у меня метод, принимающий 3 параметра. 2 последних строковые, для логики метода необязательные.

Мне кажется удобным писать перегруженные методы под каждый вариант входных параметров. Однако компилятор не позволит создать функции принимающие те два необязательные параметра по отдельности.

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

Как можно обойти такую дилемму ?
...
Рейтинг: 0 / 0
29.09.2015, 18:59
    #39064588
Pallaris
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нельзя описывать методы с одинаковыми сигнатурами.
ProBiotekМне кажется удобным писать перегруженные методы под каждый вариант входных параметров. Однако компилятор не позволит создать функции принимающие те два необязательные параметра по отдельности.

В смысле?
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
void Method3Args(string s1, string s2, string a3)
{
}

void Method2Args(string s1, string s2)
{
     Method3Args(s1,s2,String.Empty);
}

void Method1Arg(string s1)
{
     Method3Args(s1,String.Empty,String.Empty);
}
...
Рейтинг: 0 / 0
29.09.2015, 19:00
    #39064589
Pallaris
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нельзя описывать методы с одинаковыми сигнатурами.
ну и типа имена одинаковые сделать у методов
...
Рейтинг: 0 / 0
29.09.2015, 20:59
    #39064671
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нельзя описывать методы с одинаковыми сигнатурами.
ТС имеет ввиду, что он хочет иметь:
Код: c#
1.
2.
3.
void MethodFoo(string s1, string s2, string s3)
void MethodFoo(string s1, string s2)
void MethodFoo(string s1, string s3)

но задвоить второй не позволяют одинаковые сигнатуры
...
Рейтинг: 0 / 0
29.09.2015, 21:51
    #39064691
bazile
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нельзя описывать методы с одинаковыми сигнатурами.
ProBiotek, если аргументы необязательные, то можно использовать именованные параметры:
Код: c#
1.
2.
3.
4.
5.
6.
7.
Foo(1);
Foo(2, s1:"aaa");
Foo(3, s2:"bbb");

void Foo(int x, string s1 = "abc", string s2 = "def")
{
}
...
Рейтинг: 0 / 0
29.09.2015, 22:08
    #39064696
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нельзя описывать методы с одинаковыми сигнатурами.
Shocker.ProТС имеет ввиду, что он хочет иметь:
Код: c#
1.
2.
3.
void MethodFoo(string s1, string s2, string s3)
void MethodFoo(string s1, string s2)
void MethodFoo(string s1, string s3)

но задвоить второй не позволяют одинаковые сигнатурыЭто потому, что названия аргументов и функций - условность, исчезающая после компиляции. Остаются порядковые номера функций и их параметров (и типы, само собой), поэтому между вторым и третьим вариантом нет никакой разницы.
...
Рейтинг: 0 / 0
29.09.2015, 22:24
    #39064709
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нельзя описывать методы с одинаковыми сигнатурами.
ProBiotekПривет.

Нельзя описывать методы с одинаковой сигнатурой.
Но вот есть у меня метод, принимающий 3 параметра. 2 последних строковые, для логики метода необязательные.

Мне кажется удобным писать перегруженные методы под каждый вариант входных параметров. Однако компилятор не позволит создать функции принимающие те два необязательные параметра по отдельности.

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

Как можно обойти такую дилемму ?А мне кажется, что удобнее передавать один параметр типа Query, или Options, или Condition, или Criteria, или...

Дайте больше конкретики, с примером кода.
...
Рейтинг: 0 / 0
29.09.2015, 22:59
    #39064722
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нельзя описывать методы с одинаковыми сигнатурами.
skyANAА мне кажется, что удобнее передавать один параметр типа Query, или Options, или Condition, или Criteria, или...

Не сказал бы, что это удобно для прикладного кода. Такие объекты удобно «спускать» в виртуальные методы, при реализации сервисных классов, обычно именно так и делается чаще всего, но для прикладного использования это крайне неудобно, как и взвесь перегрузок методов и куча аргументов.

ProBiotekКак можно обойти такую дилемму ?

Пили fluent-интерфейс. На разработку такого интерфейса нужно больше времени, чем для других вариантов, но в последствии это окупится сторицей. Я бы сказал даже больше: вложений на десять копеек, профит на 1000 рублей.

Суть такая:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
// создаём класс типа билдера
public class SomeServiceBuilder
{
    // в конструкторе 100% обязательные параметры
    public SomeServiceBuilder(int one, string two)
    { ... }

    // дальнейшие параметры передаются через fluent
    public SomeServiceBuilder SetA(int a)
    {
       ...
       // все методы для задания дополнительных значений должны возвращать ссылку на себя
       return this;
    }

    public SomeServiceBuilder SetB(string b)
    {
        ...
        return this;
    }

    ...
 
    // получение результата, отдельный метод:

    public MyResultType Result()
    {
        ...
    }

    // можно добавить несколько методов для получения разных результатов
}

      //// пример использования:

      var myValue = new SomeServiceBuilder(1, "foobar").SetA(100).SetB("hahaha").Result();

     // в разных сценариях можно ещё создать некую фабрику, но это уже надо смотреть по задаче



вот так. и никаких перегрузок. ни одной, ни единой. всё чисто, просто, читабельно, удобно, прозрачно.
...
Рейтинг: 0 / 0
30.09.2015, 07:43
    #39064804
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нельзя описывать методы с одинаковыми сигнатурами.
hVosttskyANAА мне кажется, что удобнее передавать один параметр типа Query, или Options, или Condition, или Criteria, или...

Не сказал бы, что это удобно для прикладного кода. Такие объекты удобно «спускать» в виртуальные методы, при реализации сервисных классов, обычно именно так и делается чаще всего, но для прикладного использования это крайне неудобно.Чем же это крайне не удобно? Особенно в сочетании с fluent-интерфейс? :)
...
Рейтинг: 0 / 0
30.09.2015, 10:58
    #39064954
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нельзя описывать методы с одинаковыми сигнатурами.
skyANAЧем же это крайне не удобно? Особенно в сочетании с fluent-интерфейс? :)

семантика теряется, метод требует Criteria, а как Criteria должен быть рожден -- с ходу непонятно, т.е. нужен ещё билдер Criteria. если же всё можно задать в конструкторе, то точно также можно передать и в параметрах метода. т.е. объекты состояний не очень хорошо подходят как аргегаты данных для непосредственного вызова функций.
...
Рейтинг: 0 / 0
30.09.2015, 11:56
    #39065016
ProBiotek
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нельзя описывать методы с одинаковыми сигнатурами.
hVostt,

Про текучий интерфейс я знаю, хорошая задумка. Linq тот же построен по этому принципу.

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

Если уж и использовать флюент интерфейс для конструирования. То в отдельных фабриках. В которых сконцентрированы все эти методы и обязательный метод типа Build, завершающий построение и возвращающий уже рабочий класс.

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
public class MyClassFactory
{
   public MyClassFactory SetA(string A){}
   public MyClassFactory SetB(string B){}

   public MyClass Build (){}
}

public class MyClass
{
  private MyClass (){}
  internal MyClass (string A, string B){}
}



Стоит ли это того, чтобы вообще с этим заморачиваться, не знаю.
...
Рейтинг: 0 / 0
30.09.2015, 12:39
    #39065067
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нельзя описывать методы с одинаковыми сигнатурами.
ProBiotekСтоит ли это того, чтобы вообще с этим заморачиваться, не знаю.
так и твоя задача не стоит того, чтобы с ней заморачиваться
...
Рейтинг: 0 / 0
30.09.2015, 12:47
    #39065079
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нельзя описывать методы с одинаковыми сигнатурами.
ИзопропилProBiotekСтоит ли это того, чтобы вообще с этим заморачиваться, не знаю.
так и твоя задача не стоит того, чтобы с ней заморачиватьсявообще программирование не стоит того, чтобы с ним заморачиваться.

...
Рейтинг: 0 / 0
30.09.2015, 12:47
    #39065081
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нельзя описывать методы с одинаковыми сигнатурами.
ProBiotekСтоит ли это того, чтобы вообще с этим заморачиваться, не знаю.

Трудно сказать, не зная деталей задачи

Предложил как вариант, если возникает потребность в перегрузках и большом количестве аргументов, это явный звоночек, что надо это решать по-другому.
...
Рейтинг: 0 / 0
30.09.2015, 13:08
    #39065102
Winnipuh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нельзя описывать методы с одинаковыми сигнатурами.
AntonariyИзопропилпропущено...

так и твоя задача не стоит того, чтобы с ней заморачиватьсявообще программирование не стоит того, чтобы с ним заморачиваться.



Ничто не стоит того, чтобы с ним заморачиваться (ц)
...
Рейтинг: 0 / 0
30.09.2015, 13:41
    #39065150
ЕвгенийВ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нельзя описывать методы с одинаковыми сигнатурами.
ProBiotekНо вот есть у меня метод, принимающий 3 параметра. 2 последних строковые, для логики метода необязательные.

наводит на мысль, что внутри метода есть что то типа?
Код: c#
1.
2.
3.
4.
if(arg2!=null)
{
.......
}
...
Рейтинг: 0 / 0
30.09.2015, 13:54
    #39065171
ProBiotek
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нельзя описывать методы с одинаковыми сигнатурами.
ЕвгенийВ,

В общем. Эти два параметра, это дополнительное указание процессу о том, что ему делать.

Соответственно да, идет проверка, что если есть первый параметр, то делаем первое действие. Если есть второй параметр, то и второе.


Параметры никак не связаны друг с другом, но и не являются необходимыми - нету, ну и не делаем.

Почему не стал делать отдельными методами SetA, SetB - хочется укоротить код. Не три строчки кода, а одна.
...
Рейтинг: 0 / 0
30.09.2015, 15:04
    #39065266
Pallaris
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нельзя описывать методы с одинаковыми сигнатурами.
ProBiotekСоответственно да, идет проверка, что если есть первый параметр, то делаем первое действие. Если есть второй параметр, то и второе.


SRP failure detected
...
Рейтинг: 0 / 0
30.09.2015, 15:19
    #39065287
ProBiotek
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нельзя описывать методы с одинаковыми сигнатурами.
PallarisProBiotekСоответственно да, идет проверка, что если есть первый параметр, то делаем первое действие. Если есть второй параметр, то и второе.


SRP failure detected

Single responsibility principle
Не факт, что нарушение. Это просто опциональные действия. И не факт, что эти действия будет делать именно данный класс :) Но спасибо за замечание.

Я больше всего склоняюсь к решению bazile
Код: c#
1.
2.
3.
void Foo(int x, string s1 = "abc", string s2 = "def")
{
}


В целом наглядно. Желающие могут указывать как все опциональные параметры, так и часть.
...
Рейтинг: 0 / 0
30.09.2015, 15:23
    #39065291
Pallaris
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нельзя описывать методы с одинаковыми сигнатурами.
ProBiotekИ не факт, что эти действия будет делать именно данный класс :)

SRP относится как к классам, так и к методам.
...
Рейтинг: 0 / 0
30.09.2015, 16:42
    #39065410
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нельзя описывать методы с одинаковыми сигнатурами.
hVosttskyANAЧем же это крайне не удобно? Особенно в сочетании с fluent-интерфейс? :)

семантика теряется, метод требует Criteria, а как Criteria должен быть рожден -- с ходу непонятно, т.е. нужен ещё билдер Criteria. если же всё можно задать в конструкторе, то точно также можно передать и в параметрах метода. т.е. объекты состояний не очень хорошо подходят как аргегаты данных для непосредственного вызова функций.Слушай, давай я заменю Criteria на Command, или Action, или Predicat :)

Какая ещё семантика у тебя теряется? Мы задачи не знаем.

К примеру в CQRS есть Commands и есть Queries... И никакая семантика там не теряется, а код прикладнее некуда :)
...
Рейтинг: 0 / 0
30.09.2015, 16:50
    #39065419
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нельзя описывать методы с одинаковыми сигнатурами.
наглядное пособие - как раздуть из мухи слона -)
...
Рейтинг: 0 / 0
30.09.2015, 17:06
    #39065444
ProBiotek
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нельзя описывать методы с одинаковыми сигнатурами.
Изопропилнаглядное пособие - как раздуть из мухи слона -)

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

В принципе, я и хотел узнать разные варианты, выбрал один из них.
...
Рейтинг: 0 / 0
30.09.2015, 18:00
    #39065514
Monochromatique
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нельзя описывать методы с одинаковыми сигнатурами.
ProBiotek Linq тот же построен по этому принципу.

O_O

Ваще мимо.
...
Рейтинг: 0 / 0
30.09.2015, 19:12
    #39065582
ProBiotek
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нельзя описывать методы с одинаковыми сигнатурами.
Monochromatique,

В принципе для классического флюента важно, что методы вызываются у одного и того же объекта, а в Линке, методы возвращают новые объекты/списки. Linq правильней назвать Method Chaining конечно.

Это я к слову писал просто :)
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Нельзя описывать методы с одинаковыми сигнатурами. / 25 сообщений из 35, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]