Вы использовали бы регионы в длинных объявлениях переключателя/перечисления?

Основываясь на работе Эдуарда Лопеса, я создал индикатор выполнения, который соответствует размеру экрана, каким бы он ни был. Проверьте это.

enter image description here

Он также размещен на Git Hub .

#!/bin/bash
#
# Progress bar by Adriano Pinaffo
# Available at https://github.com/adriano-pinaffo/progressbar.sh
# Inspired on work by Edouard Lopez (https://github.com/edouard-lopez/progress-bar.sh)
# Version 1.0
# Date April, 28th 2017

function error {
  echo "Usage: [110] [SECONDS]"
  case $1 in
    1) echo "Pass one argument only"
    exit 1
    ;;
    2) echo "Parameter must be a number"
    exit 2
    ;;
    *) echo "Unknown error"
    exit 999
  esac
}

[[ $# -ne 1 ]] && error 1
[[ $1 =~ ^[0-9]+$ ]] || error 2

duration=${1}
barsize=$((`tput cols` - 7))
unity=$(($barsize / $duration))
increment=$(($barsize%$duration))
skip=$(($duration/($duration-$increment)))
curr_bar=0
prev_bar=
for (( elapsed=1; elapsed<=$duration; elapsed++ ))
do
  # Elapsed
prev_bar=$curr_bar
  let curr_bar+=$unity
  [[ $increment -eq 0 ]] || {  
    [[ $skip -eq 1 ]] &&
      { [[ $(($elapsed%($duration/$increment))) -eq 0 ]] && let curr_bar++; } ||
    { [[ $(($elapsed%$skip)) -ne 0 ]] && let curr_bar++; }
  }
  [[ $elapsed -eq 1 && $increment -eq 1 && $skip -ne 1 ]] && let curr_bar++
  [[ $(($barsize-$curr_bar)) -eq 1 ]] && let curr_bar++
  [[ $curr_bar -lt $barsize ]] || curr_bar=$barsize
  for (( filled=0; filled<=$curr_bar; filled++ )); do
    printf "▇"
  done

  # Remaining
  for (( remain=$curr_bar; remain<$barsize; remain++ )); do
    printf " "
  done

  # Percentage
  printf "| %s%%" $(( ($elapsed*100)/$duration))

  # Return
  sleep 1
  printf "\r"
done
printf "\n"
exit 0

Наслаждайтесь

6
задан Noldorin 26 June 2009 в 18:52
поделиться

6 ответов

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

Они здесь по какой-то причине, используйте их в своих интересах.

3
ответ дан 16 December 2019 в 21:45
поделиться

У вас также может быть Dictionary <[your_enum_type], Action> (или Func вместо Action) или что-то подобное (учитывая, что ваши функции имеют аналогичную подпись). Тогда вы могли бы вместо использования переключателя вместо:

        switch (item)
        {
            case Enum1: func1(par1, par2)
                break;
            case Enum2: func2(par1, par2)
                break;
        }

иметь что-то вроде:

public class MyClass
{
    Dictionary<int, Action<int, int>> myDictionary;
    //These could have only static methods also
    Group1Object myObject1;
    Group2Object myObject2;

    public MyClass()
    {
        //Again, you wouldn't have to initialize if the functions in them were static
        myObject1 = new Group1Object();
        myObject2 = new Group2Object();
        BuildMyDictionary();
    }

    private Dictionary<int, Action<int, int>> BuildMyDictionary()
    {
        InsertGroup1Functions();
        InsertGroup2Functions();
        //...
    }

    private void InsertGroup2Functions()
    {
        myDictionary.Add(1, group2.AnAction2);
        myDictionary.Add(2, group2.AnotherAction2);
    }

    private void InsertGroup1Functions()
    {
        myDictionary.Add(3, group1.AnAction1);
        myDictionary.Add(4, group1.AnotherAction1);
    }


    public void DoStuff()
    {
        int t = 3; //Get it from wherever
        //instead of switch
        myDictionary[t](arg1, arg2);
    }
}
3
ответ дан 16 December 2019 в 21:45
поделиться

Я бы оставил это как огромный список случаев / значений.

1
ответ дан 16 December 2019 в 21:45
поделиться

Если есть несколько случаев с одним и тем же блоком кода, с помощью шаблона разработки стратегии можно удалить блок переключения. Это может создать для вас множество классов, но покажет, насколько это сложно на самом деле, и разделит логику на более мелкие классы.

1
ответ дан 16 December 2019 в 21:45
поделиться

Избавьтесь от перечислений и превратите их в объекты. Затем вы могли бы вызывать методы своих объектов и сохранять код разделенным, поддерживать его, а не кошмар.

Очень мало случаев, когда вам действительно нужно использовать перечисление вместо объекта, и никто не любит длинные операторы переключения.

0
ответ дан 16 December 2019 в 21:45
поделиться

Вот хороший ярлык для людей кто использует регионы.

Я переключался между Eclipse и Visual Studio, когда я попытался перейти в полноэкранный режим в VS, нажав

Ctrl-M-M

, и вот, регион закрылся и расширился!

0
ответ дан 16 December 2019 в 21:45
поделиться
Другие вопросы по тегам:

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