Как избежать синтаксиса запаха кода (else..if)?

Эта функция не используется для английского языка. Я перевел слова на английском языке. Это необходимо для большей фиксации перед использованием на английском языке.

function ago($d) {
$ts = time() - strtotime(str_replace("-","/",$d));

        if($ts>315360000) $val = round($ts/31536000,0).' year';
        else if($ts>94608000) $val = round($ts/31536000,0).' years';
        else if($ts>63072000) $val = ' two years';
        else if($ts>31536000) $val = ' a year';

        else if($ts>24192000) $val = round($ts/2419200,0).' month';
        else if($ts>7257600) $val = round($ts/2419200,0).' months';
        else if($ts>4838400) $val = ' two months';
        else if($ts>2419200) $val = ' a month';


        else if($ts>6048000) $val = round($ts/604800,0).' week';
        else if($ts>1814400) $val = round($ts/604800,0).' weeks';
        else if($ts>1209600) $val = ' two weeks';
        else if($ts>604800) $val = ' a week';

        else if($ts>864000) $val = round($ts/86400,0).' day';
        else if($ts>259200) $val = round($ts/86400,0).' days';
        else if($ts>172800) $val = ' two days';
        else if($ts>86400) $val = ' a day';

        else if($ts>36000) $val = round($ts/3600,0).' year';
        else if($ts>10800) $val = round($ts/3600,0).' years';
        else if($ts>7200) $val = ' two years';
        else if($ts>3600) $val = ' a year';

        else if($ts>600) $val = round($ts/60,0).' minute';
        else if($ts>180) $val = round($ts/60,0).' minutes';
        else if($ts>120) $val = ' two minutes';
        else if($ts>60) $val = ' a minute';

        else if($ts>10) $val = round($ts,0).' second';
        else if($ts>2) $val = round($ts,0).' seconds';
        else if($ts>1) $val = ' two seconds';
        else $val = $ts.' a second';


        return $val;
    }
-2
задан mohet 11 March 2019 в 16:19
поделиться

2 ответа

Вот код, который приблизительно соответствует вашему питону. Однако это просто закрытие ключа на карте ...

def registry=[:]
def register(String key, Closure c){ registry[key]=c }

register('f1'){ println 'running f1' }

registry.f1() // this will call f1
0
ответ дан daggett 11 March 2019 в 16:19
поделиться

Приведенный ниже код определяет фиктивные функции pushX() для имитации функций в вашем примере, затем определяет карту замыканий, где каждое замыкание вызывает соответствующую функцию pushX(), затем ищет соответствующее замыкание по имени и вызывает его, передавая имя в качестве параметра:

def pushA(def name) { println "In pushA() with $name" }
def pushB(def name) { println "In pushB() with $name" }

def funcMap = [
    a: { pushA(it) },
    b: { pushB(it) }
]

def repoName = 'a'

// Invoke the closure mapped to 'repoName', also passing 'repoName' as a parameter.
funcMap[repoName].call(repoName)

Может быть, что-то подобное будет работать для вас. Это все еще пахнет довольно плохо, хотя; если pushA() используется только когда нажимается на репо А, зачем ему имя репо в качестве параметра? Вполне может быть лучший способ организовать все это, включая части, не показанные выше.

0
ответ дан Chris Long 11 March 2019 в 16:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: