1. Java / Говнокод #25832

    −1

    1. 1
    Официальный тредик для обсирания джавы

    Один пост -- один обсёр
    поехали

    Запостил: 6a6yuH, 12 Сентября 2019

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

    • abstract class Mammal {
      		void giveMilk(){}
      		abstract String talk();
      	}
      	
      	class Cat extends Mammal {
      		@Override
      		String talk() {
      			return "miau";
      		}
      	}
      	class Dog extends Mammal {
      		@Override
      		String talk() {
      			return "wwaf";
      		}
      	}

      И тут я решил научить кошку и собаку танцевать. Как мне добавить им метод с реализацией без копипаста?
      Миксинов и множественного наследия в жабе нет.

      Можно сделать интерфейс DancingMammal и реализовать его посредством делегирования вызовов от инстанса, который хранить внутри (замена наследия делегацией), но для классов (а Mammal это класс) это не работает, да и бойлерплейта будет много.

      Привет, кобенаторный взрыв
      class DancingDog extends Dog {
      		void dance(){}
      	}
      	class DancingCat extends Cat {
      		void dance(){} // Copy/paste
      	}
      .

      А арену выходит котлин, и говорит: "у меня есть сахар для делегирования, замени им наследование".

      abstract class Mammal {
      		fun giveMilk(){}
      		abstract fun talk():String
      	}
      	
      	class Cat : Mammal() {
      		override fun talk() = "miau"		
      	}
          
          class Dog : Mammal() {
      		override fun talk() = "wwaf"		
      	}
          
          class DancingMammal(private val mammal:Mammal): Mammal by mammal {
              fun dance(){} //No copypaste
          }

      Казалось бы: всё классно, класс один, но(!!!) делегирование НЕ работает для abstract class Mammal , так что если бы он был интерейсеом -- было бы меньше писанины, чем в джаве. Но так как он класс -- котлин уходит сосать тот же хуй, что сосет джава (подозреваю что на пару с сишарпом).
      Ответить
      • И тут на сцену выходит C++.

        class Mammal
        {
        public:
        	void giveMilk()
        	{
        	}
        
        	virtual std::string talk() = 0;
        };
        
        class Cat : public Mammal
        {
        public:
        	std::string talk() override
        	{
        		return std::string("miau");
        	}
        };
        
        class Dog : public Mammal
        {
        public:
        
        	std::string talk() override
        	{
        		return std::string("wwaf");
        	}
        };
        
        
        template <typename Parent>
        class DancingMammal : Parent
        {
        	static_assert(std::is_base_of<Mammal, Parent>::value, "Please, extend Mammal");
        public:
        	void dance()
        	{
        		std::cout << "I am dancing\n";
        		std::cout << this->talk();
        	}
        };


        Хуяк, вы слушаете маяк: У нас ОДИН класс (ну окей, их два, но это делает копулятор) и никакого копипаствы.

        Конечно, если млеков у нас будет 158, то секция кода распухнет, как укушенный осой хуй, но пока их два можно просто течь.

        Вопросы:
        1) Верно-ли я понимаю, что Java это язык для тупых неосиляторов, которые слишком тупы чтобы писать умный код, но имеют достаточно сильные пальцы, чтобы писать тупой бойлерплейт и копипаст?

        2) Как это правильно решить без божественных крестов?
        Ответить
        • показать все, что скрытоvanished
          Ответить
          • Значит, во всей публикации не понравился только термин «божественные кресты», а со всем остальным согласен?
            Ответить
        • показать все, что скрытоvanished
          Ответить
        • Я не понял, а какую задачу тут решили божественные кресты? Добавить в разные классы метод с одинаковой реализацией? Потому что научить имеющийся экземпляр млекопитающего (да хотя бы и собаку) нельзя; dance() можно вызывать, только если уже создан DancingMammal, и мы знаем его тип. То есть абстрактного DancingMammal у нас не будет - например, реализовать класс MammalDisco с методом addDancer(DancingMammal *m) мы не можем.
          Какой-нибудь реальный пример можно?
          Ответить
          • показать все, что скрытоvanished
            Ответить
            • Это понятно, просто пока не смог придумать, для чего это бы именно в таком виде могло пригодиться.
              Может быть, если рассматривать классы не предметной области, а инструментальные, например, контейнеры.
              template<class Containter, T>
              class BrownContainer<Containter> : public Containter<T>
              {
                public:
                  // Утиная типицазия такая утиная
                  BrownContainer<Containter> where(function<T, bool> condition) {... begin() ... end() ... }
                  void map(...) {...}
              };
              template<T>
              typedef BrownContainer<std::list, T> BrownList;
              template<T>
              typedef BrownContainer<std::vector, T> BrownVector;


              Что позволит расширять стандартные контейнеры своими методами:
              BrownList l = ...;
              BrownList ll = l.where(...);
              func_that_takes_std_list(ll);

              В C# это делается с помощью extension methods.
              Ответить
              • Разве extension methods позволят реализовать интерфейс?
                Ответить
                • Нет, я просто пытаюсь придумать, зачем вышеприведенный прием, невозможный в анскилльной Джаве, может пригодиться.
                  Ответить
      • показать все, что скрытоvanished
        Ответить
      • (на мотив песни "Whoo-hoo")

        miau-miau, miau-miau-miau,
        miau-miau, miau-miau-miau,
        miau-miau, miau-miau, miau-miau-miau-miau
        Ответить
        • https://youtu.be/kqHnw5ggrJU

          Вот ты и спалился.
          Ответить
        • *реклама мяу-микс с котом в аквариуме*
          Ответить
          • Пытался нагуглить в «Ютубе», не получается.
            Ответить
            • Это не на ютьюбе, это в 90-х в телевизоре.
              Впрочем, https://www.youtube.com/watch?v=4y5wsrXb2xI
              Ответить
              • Да я помню. Я просто не смог найти архивную запись.

                >> 90's Purina Meow Mix Cat Food Commercial

                Оказывается, слово «Purina» нужно было добавить, чтобы отсеять хлам. Я бренд не запомнил, помню только «Мяу-микс».
                Ответить
    • показать все, что скрытоvanished
      Ответить
    • Java не нужна
      Ответить
    • показать все, что скрытоvanished
      Ответить

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