Goвно / Говнокод #26716 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  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 anon007, (Updated )

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

  • Там реально для каждого языка отдельные поля для имени?
    Ответить
  • Это го?
    Автор нескалярные структуры данных еще не проходил?
    Ответить
    • Ага, это вынеси 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.
            Перевёл на 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());
            Ответить
          • Груви будешь?
            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");
            	}
            }
            Ответить
            • У вас баг: итальянский не инициализируется и вызывает сегфолт при доступе.

              - 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)
                          Ответить
                          • Что-то не могу найти реальный пример когда я обосрался из за макросов, там было какое-то 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 на худой конец....
              Ответить
          • тебе нужна 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 кстати тоже почему-то не рекомендуют, там какой-то пердолинг с ассоциативностью и прочее веселье от питуха, которому надо не-как-у-всех
              Ответить
              • там приоритет бльно малый
                лучше &&
                Ответить
    • а вообще вы просто непонимаете го @@ го это про простоту и ненужны мне ваше абтсракци...
      Ответить

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

Переведи на "PHP", guest!

    А не использовать ли нам bbcode?


    8