1. Go / Говнокод #26716

    +1

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    func (svc *UserSvc) isEmptyName(name model.User_Name) bool {
      if name.First.RU == "" {
        if name.First.EN == "" {
          if name.First.TR == "" {
            if name.First.IT == "" {
              if name.Last.RU == "" {
                if name.Last.EN == "" {
                  if name.Last.TR == "" {
                    if name.Last.IT == "" {
                      return true
                    }
                  }
                }
              }
            }
          }
        }
      }
      return false
    }

    Проверка заполненности имени пользователя хотя - бы на одном из языков.

    Запостил: anon007, 01 Июня 2020

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

    • Там реально для каждого языка отдельные поля для имени?
      Ответить
    • Зато не "PHP"
      Ответить
    • Это го?
      Автор нескалярные структуры данных еще не проходил?
      Ответить
      • пока только анскилябрные
        Ответить
      • Ага, это вынеси name в отдельную структуру(и дочерние тоже - First, Last), реализуй у них метод isEmpty, не катит......сложна!
        Ответить
        • Да вот да.
          Я не знаю го, потому напишу, например, на руби
          class Name
            attr_accessor :first, :last
          
            def initialize
              @first = Hash.new
              @last = Hash.new
            end
          
            def is_empty
              @first.empty? and @last.empty?
            end
          end
          
          name = Name.new
          name.first[:EN] = 'John'
          name.first[:RU] = 'Иван'
          name.last[:RU] = 'Пупкин'
          
          name2 = Name.new
          
          puts name.is_empty # false
          puts name2.is_empty # true
          Ответить
          • Спасибо, конечно, но нужно на Go
            Ответить
            • Извини, я не знаю Go.
              Перевёл на JavaScript.
              "use strict";
              
              class Name {
              	constructor() {
              		this.first = {};
              		this.last = {};
              	}
              	is_empty() {
              		const n =  Object.keys(this.first).length + Object.keys(this.last).length;
              		return n === 0;
              	}
              }
              
              const n = new Name();
              n.first.EN = 'joe';
              const n2 = new Name();
              
              console.log(n.is_empty());
              console.log(n2.is_empty());
              Ответить
              • Компилятор не съест Ваши console.log, и Object.keys.
                Да и кто на JS пишет названия методов в стиле snake_case?
                Ответить
              • n.first.OLBANIAN = "Жор"
                Ответить
            • Груви будешь?
              class Name {
              	def first = [:]
              	def last = [:]
              
              	def isEmpty() {
              		this.first.keySet().isEmpty() && this.last.keySet().isEmpty()
              	}
              }
              
              def name = new Name()
              def name2 = new Name()
              
              name.first.EN = 'joe';
              
              println(name.isEmpty())
              println(name2.isEmpty())
              Ответить
            • лучше перепеши на перл
              #!/usr/bin/perl -w
              use strict;
              use v5.22;
              
              package Name;
              	sub new {
              		my $self = bless {first => {}, last => {}};
              		return $self;
              	}
              	sub not_empty {
              		my $this = pop;
              		scalar keys(%{$this->{'first'}}) + scalar keys (%{$this->{'last'}});
              	}
              1;
              
              my $name = Name->new;
              my $name2 = Name->new;
              $name->{'first'}{'EN'} = "John";
              
              printf "name is empty" if not $name->not_empty;
              printf "name2 is empty" if not $name2->not_empty;
              Ответить
            • кажется, тебе подойдет си
              #include <stdio.h>
              #include <string.h>
              
              enum languages {RU, EN, IT};
              #define LAST_LANG IT
              struct Name {
              	char* first[LAST_LANG];
              	char* last[LAST_LANG];
              };
              
              static size_t is_empty(const struct Name *name) {
              	size_t size;
              	for(enum languages lang = RU; lang < LAST_LANG; lang++) {
              		size += strnlen(name->first[lang], 10);
              		size += strnlen(name->last[lang], 10);
              	}
              	return size;
              }
              
              static void init(struct Name *name){
              	for(enum languages lang = RU; lang < LAST_LANG; lang++) {
              		name->first[lang] = "";	
              		name->last[lang] = "";	
              	}
              }
              
              void main() {
              	struct Name name, name2;
              	init(&name);
              	init(&name2);
              	name.first[RU] = "AA";
              	if (is_empty(&name)) {
              		printf("name is empty\n");
              	}
              	if (is_empty(&name2)) {
              		printf("name2 is empty\n");
              	}
              }
              Ответить
              • К сожалению такой Cи не подойдёт.
                Ответить
              • У вас баг: итальянский не инициализируется и вызывает сегфолт при доступе.

                - enum languages {RU, EN, IT};
                - #define LAST_LANG IT

                +enum languages {RU, EN, IT, LAST_LANG};
                Ответить
                • чочо?
                  после cpp код выглядит так
                  enum languages {RU, EN, IT};
                  
                  struct Name {
                   char* first[IT];
                   char* last[IT];
                  };


                  или ты о том, что итерироваться надо до IT + 1?
                  Ответить
                  • Енум же с нуля. Ты здесь описал массивы на 2 слота вместо трёх. Итальянцы соснули.
                    Ответить
                    • да, обосрался. Но и гост не прав.
                      Надо не так
                      enum languages {RU, EN, IT, LAST_LANG};
                      а вот так
                      enum languages {RU, EN, IT};
                      #define LAST_LANG IT + 1
                      Ответить
                      • эскобар.чпег

                        И там и там LAST_LANG == 3. Но обычно все пишут по гостовски.

                        > #define LAST_LANG IT + 1

                        #define LAST_LANG ((IT) + 1)

                        Когда уже заповеди макроёбства выучишь?
                        Ответить
                        • что плохого в том, что макрос раскроется в "IT + 1"?
                          что именно сломается?
                          Ответить
                          • В данном конкретном примере ничего не сломается т.к. у оператора < приоритет ниже чем у плюса.

                            Но в общем случае ты не знаешь, в каком контексте будет юзаться этот LAST_LANG. Может быть я захочу массив завести для переводчика и напишу LAST_LANG * LAST_LANG?

                            Поэтому expression-like макросы всегда, сука, ВСЕГДА, надо писать со скобками как вокруг каждого аргумента, так и вокруг всего выражения.
                            Ответить
                            • >В данном конкретном примере
                              то-то и оно. Пример-то шуточный.

                              если доебываться до всего, то там и char нельзя использовать (потому что там разные языки будут храниться) например

                              Впрочем, я согласен, что лучше иметь привычку всегда писать правильно. К сожалению, я пишу на сях раз в год, и потому делаю это хуёво.

                              Мне все равно не очень нравится вариант госта, потому что он портит семантику. Появляется какой-то ебанутый язык LAST_LANG. Что это за язык такой?

                              С другой стороны, он позволяет не указывать последний язык явно.

                              А можно как-то получить макс значение енума кроме как через такой хак?
                              Ответить
                              • > портит семантику

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

                                > шуточный

                                С макросами не шутят. Риск залёта очень высокий. Уже на банальном LAST_LANG * LAST_LANG всё ломается.
                                Ответить
                                • То-есть ответ на вопрос

                                  "А можно как-то получить макс значение енума кроме как через такой хак?"

                                  нет.

                                  Я верно понял?

                                  >Риск залёта очень высокий.
                                  Это я понимаю:)
                                  Я как-то попытался взять указатель на функцию, а это была не функция, а макрос
                                  Ответить
                          • Заповеди макроёбства.

                            1) Не пиши макросы
                            2) Если ты всё-таки решил запилить макрос, называй его капсом
                            3) Если ты используешь аргумент макроса, заключи его в скобки
                            4) Если ты пишешь expression-like макрос, оберни его в скобки
                            5) Если ты пишешь statement-like макрос, оберни его в do { ... } while (0)
                            Ответить
                            • 6) #undef TRUE
                              #undef FALSE
                              #undef int
                              #undef main
                              #undef void
                              #undef return
                              ...
                              Ответить
                            • Что-то не могу найти реальный пример когда я обосрался из за макросов, там было какое-то UB из-за точек следования, типа:
                              SOME_SHIT(x) = ANOTHER_SHIT(x);
                              раскрылось в какое-то говно по аналологии с i = i++ + i++, но чуть посложнее и с массивами.

                              Так что ещё одно правило: надо точно помнить, во что раскрывается макрос, и стараться не передавать туда выражения с побочкой (еще как пример можно вспомнить макрос MAX).
                              Ответить
                        • Собственно, если енумы писать не в одну строку, то вариант с LAST_ENUM выглядит бульмень нормально (ну, насколько это вообще может выглядеть нормально без lo/hi):
                          enum Colors {
                              RED,
                              GREEN,
                              BLUE,
                          };
                          
                          enum Languages {
                              RU,
                              EN,
                              IT,
                              
                              
                              LAST_LANG  // N.B.: нет запятой
                          };
                          Ответить
                          • да, если в столбик, то менее пидорски выглядит

                            в общем твой вариант ок, я зря доебался
                            Ответить
                  • Ты лох.
                    Ответить
              • нужен вариант на assembler! Он точно подойдёт!

                Или brainfuck на худой конец....
                Ответить
                • mov rax, [rdi]      ; RU
                  or  rax, [rdi + 8]  ; EN
                  or  rax, [rdi + 16] ; IT
                  jz  is_empty
                  Ответить
                  • Зачем вы пишете этот бред? Что означают эти закорючки?
                    Ответить
            • тебе нужна lua
              function createName()
              	local name  = {
              		first = {},
              		second = {},
              		is_empty = function(self)
              			for _, field in ipairs({self.first, self.second}) do
              				for _, k in pairs(field) do
              					return false
              				end
              			end
              			return true
              		end
              	}
              	return name
              end
              
              local name = createName()
              local name2 = createName()
              name.first.EN = "joe"
              
              print("Is name empty? " .. tostring(name:is_empty()))
              print("Is name2 empty? " .. tostring(name2:is_empty()))
              Ответить
            • сишарп ннада?
              enum Language
                  {
                      En,
                      Ru,
                      It
                  }
              
                  sealed class Name
                  {
                      public IDictionary<Language, string> First { get; } = new Dictionary<Language, string>();
                      public IDictionary<Language, string> Last { get; } = new Dictionary<Language, string>();
              
                      public bool IsEmpty => (First.Count + Last.Count == 0);
                  }
              
                  static class Program
                  {
                      static void Main()
                      {
                          var name = new Name();
                          var name2 = new Name();
                          name.First[Language.En] = "Joe";
              
                          Console.WriteLine(name.IsEmpty);
                          Console.WriteLine(name2.IsEmpty);
                      }
                  }
              Ответить
          • > is_empty

            по рубёвому надо `empty?`. сам долгое время ловил ворнинги от рубимайна.
            Ответить
            • ты прав, исправь пожалуйста
              Ответить
              • and кстати тоже почему-то не рекомендуют, там какой-то пердолинг с ассоциативностью и прочее веселье от питуха, которому надо не-как-у-всех
                Ответить
      • а вообще вы просто непонимаете го @@ го это про простоту и ненужны мне ваше абтсракци...
        Ответить

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