powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Нельзя описывать методы с одинаковыми сигнатурами.
25 сообщений из 35, страница 1 из 2
Нельзя описывать методы с одинаковыми сигнатурами.
    #39064540
ProBiotek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет.

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

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

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

Как можно обойти такую дилемму ?
...
Рейтинг: 0 / 0
Нельзя описывать методы с одинаковыми сигнатурами.
    #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
Нельзя описывать методы с одинаковыми сигнатурами.
    #39064589
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну и типа имена одинаковые сделать у методов
...
Рейтинг: 0 / 0
Нельзя описывать методы с одинаковыми сигнатурами.
    #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
Нельзя описывать методы с одинаковыми сигнатурами.
    #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
Нельзя описывать методы с одинаковыми сигнатурами.
    #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
Нельзя описывать методы с одинаковыми сигнатурами.
    #39064709
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ProBiotekПривет.

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

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

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

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

Дайте больше конкретики, с примером кода.
...
Рейтинг: 0 / 0
Нельзя описывать методы с одинаковыми сигнатурами.
    #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
Нельзя описывать методы с одинаковыми сигнатурами.
    #39064804
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttskyANAА мне кажется, что удобнее передавать один параметр типа Query, или Options, или Condition, или Criteria, или...

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

семантика теряется, метод требует Criteria, а как Criteria должен быть рожден -- с ходу непонятно, т.е. нужен ещё билдер Criteria. если же всё можно задать в конструкторе, то точно также можно передать и в параметрах метода. т.е. объекты состояний не очень хорошо подходят как аргегаты данных для непосредственного вызова функций.
...
Рейтинг: 0 / 0
Нельзя описывать методы с одинаковыми сигнатурами.
    #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
Нельзя описывать методы с одинаковыми сигнатурами.
    #39065067
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ProBiotekСтоит ли это того, чтобы вообще с этим заморачиваться, не знаю.
так и твоя задача не стоит того, чтобы с ней заморачиваться
...
Рейтинг: 0 / 0
Нельзя описывать методы с одинаковыми сигнатурами.
    #39065079
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилProBiotekСтоит ли это того, чтобы вообще с этим заморачиваться, не знаю.
так и твоя задача не стоит того, чтобы с ней заморачиватьсявообще программирование не стоит того, чтобы с ним заморачиваться.

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

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

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

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



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

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

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

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


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

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


SRP failure detected
...
Рейтинг: 0 / 0
Нельзя описывать методы с одинаковыми сигнатурами.
    #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
Нельзя описывать методы с одинаковыми сигнатурами.
    #39065291
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ProBiotekИ не факт, что эти действия будет делать именно данный класс :)

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

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

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

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

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

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

O_O

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

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

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


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