1. C# / Говнокод #18118

    +942

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    public static class IntExtension
        {
            public static int NotMoreThan(this int i, int thanWhat){
                return i < thanWhat ? thanWhat : i;
            }
        }

    непонятно что

    Запостил: tjmaster, 06 Мая 2015

    Комментарии (70) RSS

    • это классический `min(a, b)`, который работает как `max(a, b)`, если я не ебанулся
      Ответить
    • >> NotMoreThan

      No More!
      Ответить
    • > thanWhat
      Then what?

      P.S. Ненавижу then и than. Вечно их путаю.
      Ответить
      • А чего их путать-то? then - тогда, than - чем.
        Мне if cond then expr1 else expr2 настолько въелось в мозг, что спутать их стало сложно.
        Ответить
      • попиши на языке где есть слово "then". Напрмиер на паскале. Сразу пройдет
        Ответить
    • Что за слово this перед параметром? Зачем оно? Или это такая бесполезная хуйня для тех, кто не знает, что слово static можно не писать?
      Ответить
      • https://msdn.microsoft.com/en-us/library/vstudio/bb383977%28v=vs.110%29.aspx
        Ответить
      • это что бы потом к методу обращаться 5.NotMoreThan(3)

        Типа добавляет методы в уже существующий класс
        Ответить
        • Так оно и так внутри объявляется, нахуя?
          Или это можно и снаружи метод к классу приделать? Тогда неплохая штука, да.
          Ответить
          • Снаружи можно приделать к любым типам, включая примитивы.
            Ответить
          • это расширения. ты можешь писать их для других классов, к исходным кодам которых ты например не имеешь доступа, но нужно расширение. например
            public static class MyMathExtension 
            { 
                public static int factorial(this int x) 
                { 
                    if (x <= 1) return 1; 
                    if (x == 2) return 2; 
                    else 
                        return x * factorial(x - 1); 
                } 
            }
            это значит, что у меня для всех int появился метов factorial, который я смогу импользовать.
            Ответить
            • А это обязательно заводить статический метод в статическом классе, названном именно My%sExtension? А, я забыл, шарпик не может в функции вне классов.
              Ответить
              • можно хоть как назвать. главное все расширения должны быть в статичном классе и являться статичными методами. Ну и публичными
                Ответить
                • Что-то я про публичность не уверен. Вроде же можно приватные из самого класса использовать?
                  Ответить
                  • можно, а смысл? расширения для расширений?
                    Ответить
                    • А что, декомпозиция и инкаспуляция. Если надо расширять чем-то сложным, пришлось бы ещё один класс создавать и явно туда пихать контекст каждый раз. А так не придётся.
                      Ответить
              • обязательно только статический метод в статическом классе.
                можно подумать, то, что функция без класса не может быть это проблема.
                Ответить
                • > можно подумать, то, что функция без класса не может быть это проблема.
                  Но это действительно проблема. Класс - это тип данных, для которого определены не только его компоненты, но и функции для работы с ними.
                  Здесь же имеется какой-то странный тип данных без данных(!), к которому прикрепили функцию для работы с совершенно другим(!) типом данных.
                  Питушня, непорядок, беспредел, хватит это терпеть! Мы просто привыкли к этой жабологике, считаем её обыденностью и забыли уже наших старых товарищей - кресты и питонцы.
                  Ответить
                  • ничего странного.
                    определения для partial классов может быть разрозненным по проекту, а method extensions в другом классе типа не могут?
                    Ответить
                    • > partial класс
                      Интересная штука. Надо было int сделать partial классом, чтобы можно было добавлять методы в int, а не на деревню к дедушке.

                      Но всё же ценности отдельных функций, свободных от давления кровожадных классов, это не снижает.
                      Ответить
                  • С точки зрения того самого ООАиП нужно сопоставлять классы 1 к 1 с артефактами предметной области, без выдумки и креатива. Так что давайте не будем говорить о каноничном ООАиП - он уныл до невозможности.

                    И вообще раз пошло такое дело - в большинстве языков ООП не тру. Насколько я помню Тру оно только в смолтоке и нескольких элитарных языках
                    Ответить
                    • Ладно, если без оопитушни, то
                      ЗА СВОБОДУ ФУНКЦИЙ!
                      Ответить
                      • .net в принципе не умеет свободные функции - даже делегаты в классы заворачиваются. Видимо проигрыш от этого незначительно мал

                        А свобода функций - это фп

                        А в J - свобода глаголов!
                        Ответить
                        • > делегаты в классы заворачиваются
                          Вот и заворачивали бы func всё в какую-нибудь static $MyClass_cs$TempClass15::func, если внутри всё требуется в классах на блюдечке подавать. А пользователь (программист) чтоб этого не видел, пока ему не придётся лезть в скомпилированную питушню.
                          Ответить
                          • ну делегаты так и работают. А расширения - это просто сахарок для вызова статичных методов. Вообще юзать их не есть хорошо - путают
                            Ответить
                        • это как это? делегаты можно объявлять где угодно.
                          Ответить
                          • а что, классы нельзя объявлять где угодно?)
                            Ответить
                            • внутри других классов нельзя.
                              Ответить
                              • наивный

                                http://ideone.com/nmbYrf
                                Ответить
                                • Убил бы нахуй.
                                  Ответить
                                  • А мне кажется, что полезная фича. Можно неплохо ограничить видимость.
                                    Вот только что меня бесит - так это связь this внешного класса с внутренним классом в Java, если не писать лишний раз где-то слово "static". Не знаю, как в C#, а вот поведение в C++ мне больше нравится.
                                    Ответить
                                    • > поведение в C++ мне больше нравится
                                      Передавай this в конструктор ребёнка руками, передавай руками, сука!

                                      Нормально там всё, разве что немного неинтуитивно, что эта связь по-умолчанию включена. Мне вот жабьего поведения в крестах не хватало ;( Впрочем, его там в общем виде и не запилить из-за отсутствия gc.
                                      Ответить
                                      • > немного неинтуитивно, что эта связь по-умолчанию включена.
                                        Вот! Действительно.
                                        Ответить
                                        • Но фича то годная.

                                          А по-умолчанию оно там, походу, из-за того, что static класс внутри другого не особо то и нужен - его можно унести на один уровень с родителем и поставить уровень доступа package private.
                                          Ответить
                                          • > static класс внутри другого не особо то и нужен
                                            Но это помогает эффективнее использовать тот самый ФОЛДИНГ, про который некогда говорил Пи.
                                            Ответить
                                    • в шарпе нельзя через this из внутреннего класса обратиться к элементам внешнего, только к своим
                                      Ответить
                                      • Зачем они нужны ну кроме как заебать программиста вложенностью?
                                        Ответить
                                        • класс - это такой же обьект, как и программа и тоже мы можем захотеть разбить его уровни абстракции согласно ООП. why not?

                                          А публичные классы как правило предполагают анальную зависимость от внешнего класса, и само его создание требуется только для получения типа для подстановки во всякие обработчики извне. Ну например

                                          http://ideone.com/NssctQ
                                          Ответить
                                          • >>анальную зависимость
                                            Слушай, тебя словно подменили! Мне нравится, как ты общаешься и троллишь. Респект!
                                            Ответить
                                            • http://i17.beon.ru/70/42/2024270/77/83206477/0.png
                                              Ответить
                                              • >http://i17.beon.ru/70/42/2024270/77/83206477/0.png
                                                403
                                                Ответить
                                                • Ссылка только для натуралов
                                                  Ответить
                                                  • Ссылка только для духовной парахи?

                                                    У вас не все сайты вне рахи уже забанены?
                                                    Ответить
                                                    • Давай друг у друга троллить?
                                                      Ответить
                                                      • Сказал троллить а прозвучало как дроллить
                                                        Давайте каждый сам у себя будет троллить
                                                        Ответить
                                          • >http://ideone.com/NssctQ
                                            скажи честно, ты упоролся? зачем там делегат?
                                            Ответить
                                            • суррогатный пример, что тебе не так? Суть показывает
                                              Ответить
                                              • вот лучше пример
                                                class Order
                                                {
                                                    private List<OrderLine> _orderLines = new List<OrderLine>();
                                                 
                                                    public void AddOrderLine(string product, int quantity, double price)
                                                    {
                                                        OrderLine line = new OrderLine();
                                                        line.ProductName = product;
                                                        line.Quantity = quantity;
                                                        line.Price = price;
                                                        _orderLines.Add(line);
                                                    }
                                                 
                                                    public double OrderTotal()
                                                    {
                                                        double total = 0;
                                                        foreach (OrderLine line in _orderLines)
                                                        {
                                                            total += line.OrderLineTotal();
                                                        }
                                                        return total;
                                                    }
                                                 
                                                    // Nested class
                                                    private class OrderLine
                                                    {
                                                        public string ProductName { get; set; }
                                                        public int Quantity { get; set; }
                                                        public double Price { get; set; }
                                                 
                                                        public double OrderLineTotal()
                                                        {
                                                            return Price * Quantity;
                                                        }
                                                    }
                                                }
                                                
                                                Order order = new Order();
                                                order.AddOrderLine("Cheese", 5, 1.99);
                                                order.AddOrderLine("Oranges", 12, 0.35);
                                                Console.WriteLine(order.OrderTotal());  // Outputs "14.15"
                                                Ответить
                                                • Так мой пример был на использование публичного внутреннего класса, с приватным то и так все понятно
                                                  Ответить
                                                • А не лучше бы тут OrderLine разместить вне класса. Тогда можно сделать метод у Order GetOrderLine и отдавать инстанс класса хранилища. И я не понимаю чем мешает открытие класса OrderLine для всех желающих.
                                                  Ответить
                                                  • >А не лучше бы тут OrderLine разместить вне класса. Тогда можно сделать метод у Order GetOrderLine и отдавать инстанс класса хранилища. И я не понимаю чем мешает открытие класса OrderLine для всех желающих.
                                                    наверное потому, что внутренний класс может выполнять всю черную работу, и быть необходимым только для класса, где он определен.
                                                    в данном примере, есть класс с заказами. ты их туда пушишь, указываешь продукт, стоимость и количество. данный класс хранит их в коллекции специальных контейнеров. при вызове метода OrderTotal возвращает сумму заказов.
                                                    не самый лучший пример конечно же, но представим например, есть один класс, который скажем производит загрузку файлов.
                                                    ты передаешь ему файл, протокол и URL, а он внутри в виде приватных классов имеет реализацию нужных тебе протоколов, и вызывает их. и получается, что не будет у одного класса методов
                                                    UploadFileHttp
                                                    UploadFileFtp
                                                    UploadFileFtps
                                                    UploadFileSftp
                                                    UploadFile....
                                                    давай только не будем начинать "можно же отдельно реализовать все эти аплоудеры".
                                                    Ответить
                                                    • Почему он должен быть именно внутренним, а не приватным для пакета/неймспейса? Или в c# так нельзя?
                                                      Ответить
                                                      • >Почему он должен быть именно внутренним, а не приватным для пакета/неймспейса? Или в c# так нельзя?
                                                        internal имеет видимость внутри сборки, поэтому внутри моей сборки он будет как public, но если этот класс выполняет работу только внутри какого-то класса, я не вижу причин делать его internal, private будет в самый раз.
                                                        Ответить
                                                      • можно. Еще раз повторяю - это не необходимость, это возможность
                                                        Ответить
                                          • Нет типа класса stdClass как в php? Я не особо понимаю необходимость в это внутреннем классе. по мне он только мешает.
                                            Ответить
                                            • > Я не особо понимаю необходимость в это внутреннем классе. по мне он только мешает.

                                              Он прячет часть реализации. Вложенные классы удобны, например, при реализации итераторов. Точный тип итератора не торчит наружу, доступен только через интерфейс.
                                              Ответить
                                            • Это просто фича, суть в том, что класс скрывает целую подсистему.
                                              По сути - это такой встроенный в язык фасад.
                                              >> Я не особо понимаю необходимость
                                              нет необходимости. Как и в ООП нет необходимости. Просто фича
                                              Ответить
                                      • Зато к private'ам можно через объект.
                                        http://ideone.com/k4Sprh
                                        Ответить
                                        • Кстати да. и к статичным без указания класса вообще
                                          http://ideone.com/OGPlYZ
                                          Ответить
                                • Это же жаваёбский костыль для объявления коллбеков, зачем он в сишарпе?
                                  Ответить
      • как то так

        http://ideone.com/OlPG8p
        Ответить
    • А только мне кажется, что автор перепутал знаки < и > (ну, или слова More и Less)?
      Ответить
    • Это обыкновенный Extension Method в C#:

      using System;
      using System.Xml.Linq;
      using System.IO;
      using System.IO.Compression;
      
      namespace ConsoleApp
      {
      	class Program
      	{
      		static void Main(string[] args)
      		{
      			var excel_file = @"C:\File1293.xlsx";
      			ZipArchive zipFile = ZipFile.OpenRead(excel_file);
      			ZipArchiveEntry first_entry = zipFile.Entries[0];
      			XElement xml = first_entry.GetXML();
      			Console.WriteLine(xml.ToString());
      		}
      	}
      
      	internal static class ExtensionMethods
      	{
      		internal static XElement GetXML(this ZipArchiveEntry zipEntry)
      		{
      			using (Stream stream = zipEntry.Open())
      				return XElement.Load(stream);
      		}
      	}
      
      }
      Ответить
      • О, великий мастер спас нас всех!

        Читать пробовал перед тем как писать?
        Ответить
    • Мдас. Какой-то не от мира сего бедняга пытается спасать из проруби тонущее говно... Герой, чего уж там!..
      Ответить
      • Какой-то не от мира сего бедняга пытается утопить говно в проруби... Пидар, чего уж там!..
        Ответить

    Добавить комментарий