Как Вы осуществили бы рефакторинг это условное выражение для использования полиморфизма?

Вот код, который вы можете использовать

Также пара моментов, связанных с вашим кодом csv.reader, является излишним. Все делается с помощью просто встроенных модулей - это не внешние зависимости.

Также использование имен переменных, таких как read, не очень хорошая идея.

lines = """1 1011.720000 1830.340000            0            0            0           191340          ?   1.000000
 2 1011.720000 1830.340000            0            0            0           725670          ?   2.000000
 3 1011.720000 1830.340000            0            0            0       1.4378e+06          ?   3.000000
 4 1011.720000 1830.340000            0            0            0        2.178e+06          ?   4.000000
 5 1011.720000 1830.340000            0            0            0       2.8806e+06          ?   5.000000
 6 1011.720000 1830.340000            0            0            0       3.5353e+06          ?   6.000000
 7 1011.720000 1830.340000            0            0            0       4.1598e+06          ?   7.000000
 8 1011.720000 1830.340000            0            0            0       4.7729e+06          ?   8.000000
 9 1011.720000 1830.340000            0            0            0       5.3924e+06          ?   9.000000
10 1011.720000 1830.340000            0            0            0       6.0281e+06          ?  10.000000"""

for line in lines.split("\n"):
    toks = line.split() # This should split the line into tokens separated by one or more white space characters. 

    if len(toks) == 9: # Just to make sure there are enough tokens. 
        # do whatever you want
        print (toks[6])
8
задан Jay Bazuzi 11 December 2008 в 06:24
поделиться

9 ответов

Просто предостережение здесь после наблюдения некоторых из них (технически корректный) reponses, просто избавление от, Если оператор не должен быть Вашей единственной целью, целью, должно быть должно сделать Ваш код расширяемым, удобным в сопровождении и простым, если это означает избавляться от, если оператор, большой, но это не должна быть цель в себя.

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

8
ответ дан 5 December 2019 в 13:02
поделиться

Вы будете на самом деле реализовывать что-то как Стратегическая модель. Запустите путем определения суперкласса, позволяет, называют это AbstractTableInfoCommand. Этот класс может быть абстрактным, но должен указать метод, названный runTableInfoCommand ().

Можно затем определить несколько sub классов что каждая реализация runTableInfoCommand () метод. Ваш класс, тот со свойством Number, будет затем иметь новое свойство типа AbstractTableInfoCommand (позволяет, называют это tableInfoCommand), который инстанцируют к одному из бетона sub классы AbstractTableInfoCommand.

Код затем будет:

public int Number
    {
        get
        {

            return this.tableInfoCommand.runTableInfoCommand();
        }
    }

Таким образом, можно создать NullTableInfoCommand и SomeOtherTableInfoCommand и т.д. Преимущество состоит в том, что, если у Вас есть некоторое новое условие для возврата tableinfocommand затем, Вы добавляете новый класс, а не редактируете этот код.

Однако не каждая ситуация является обязательно правильной для этого шаблона. Таким образом, это делает больше растяжимого кода, но если Вы находитесь в ситуации, которая не требует, чтобы extendability это mioght были излишеством.

4
ответ дан 5 December 2019 в 13:02
поделиться

Я чувствую, что Ваш код прекрасно подходит. Читаемый. Простой. (И я надеюсь, что это работает). Если у Вас есть этот блок кода, повторяющийся n времена, необходимо удалить дублирование путем применения метода Извлечения.

Рефакторинг Вас указывает, предназначен для замены повторяющихся случаев переключателя.. не простой, если операторы как в Вашем примере. Замените Условное выражение Полиморфизмом. Помните 'самую простую вещь, которая работает'.. что означает минимальное количество классов и методов, требуемых сделать задание.

1
ответ дан 5 December 2019 в 13:02
поделиться

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

public class Thing
{
  public IValueFetcher ValueFetcher { get; set; }

  public int Number 
  { 
    get 
    {
      return this.ValueFetcher.GetValue<int>(/* parameters to identify the value to fetch */);
    }
  }
}

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

Я думаю в какой-то момент, что Вы, вероятно, будете иметь, если оператор как все еще необходимо решить, какую версию RunTableInfoCommand Вы хотите назвать.

0
ответ дан 5 December 2019 в 13:02
поделиться

Я принимаю internTableName и InternalTableNumber своего рода значение для того же самого. Почему бы не обернуть его в классе и передаче экземпляр того класса к this.RunTableInfoCommand как так:

public int Number
        {
            get
            {
                string returnValue;
                internalTableClass myinstance(parameters);
                return Convert.ToInt32(this.RunTableInfoCommand(myinstance, TableInfoEnum.TAB_INFO_NUM));
            }
        }

если Вы все еще хотите использовать полиморфизм затем, можно сделать так в том классе путем перегрузки, например, a giveInternalTableIdentifier это возвращает число или имя

код здесь мог затем быть похожим на это:

public int Number
        {
            get
            {
                string returnValue;
                internalTableClass myinstance(parameters);
                return Convert.ToInt32(this.RunTableInfoCommand(myinstance.giveInternalTableIdentifier, TableInfoEnum.TAB_INFO_NUM));
            }
        }

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

0
ответ дан 5 December 2019 в 13:02
поделиться

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

С тех пор RunTableInfoCommand(), internalTableNumber, и internalTableName все, кажется, члены того же того же класса, хороший, легкий рефакторинг мог бы быть должен добавить перегрузку RunTableInfoCommand() это просто берет a TableInfoEnum оцените и делает логику выяснения который другой RunTableInfoCommand() перегрузку нужно назвать:

private string RunTableInfoCommand( TableInfoEnum infoEnum)
{
    if (this.internalTableNumber == null) {
        return this.RunTableInfoCommand( internalTableName, infoEnum);
    }

    return this.RunTableInfoCommand( internalTableNumber.Value, infoEnum);
}

Затем многочисленные сайты вызова, которые имеют то же if логика решения может быть свернута к:

returnValue = this.RunTableInfoCommand( TableInfoEnum.TAB_INFO_NUM);    
                                        // or whatever enum is appropriate
0
ответ дан 5 December 2019 в 13:02
поделиться

Я осуществил бы рефакторинг его таким образом:

table = this.internalTableNumber == null ? internalTableName : internalTableNumber.Value;
return Convert.ToInt32(this.RunTableInfoCommand(table, TableInfoEnum.TAB_INFO_NUM));

Любите тернарный оператор.

0
ответ дан 5 December 2019 в 13:02
поделиться

ОТРЕДАКТИРУЙТЕ 2, Как я действительно решил бы проблему.

Я сделал бы InternalTableNumber свойством, которое является лениво загруженный. Если бы это не доступно затем, я искал бы его через InternalTableName. Затем я всегда просто использовал бы свойство InternalTableNumber для своих методов.

 private int? internalTableNumber;
 private int InternalTableNumber
 {
     get
     {
         if (!internalTableNumber.HasValue)
         {
             internalTableNumber = GetValueFromTableName( internalTableName );
         }
         return internalTableNumber;
     }
     set
     {
         internalTableNumber = value;
     }
 }

 public int Number
 {
     get
     {
        string value = this.RunTableInfoCommand(InternalTableNumber,
                                                TableInfoEnum.TAB_INFO_NUM);
        return Convert.ToInt32( value );
     }
 }

РЕДАКТИРОВАНИЕ Используя полиморфизм...

Давайте предположим, что Ваш текущий класс называют Foo, затем я осуществил бы рефакторинг его в два класса, FooWithName и FooWithNumber. FooWithName был бы классом, который Вы будете использовать, когда у Вас будет имя таблицы, и FooWithNumber был бы классом для использования, когда у Вас есть число таблицы. Я затем записал бы каждый класс с методом Числа - на самом деле, я запишу интерфейс IFoo также, который каждый реализует так, чтобы они могли использоваться interchangably.

public interface IFoo
{
     int Number { get; }|

}

public class FooWithName : IFoo
{
     private string tableName;
     public FooWithName( string name )
     {
         this.tableName = name;
     }

     public int Number
     {
        get { return this.RunTableInfoCommand(this.tableName,
                                       TableInfoEnum.TAB_INFO_NUM);
     }

     ... rest of class, including RunTableInfoCommand(string,int);
}

public class FooWithNumber : IFoo
{
     private int tableNumber;
     public FooWithNumber( int number )
     {
         this.tableNumber = number;
     }

     public int Number
     {
        get { return this.RunTableInfoCommand(this.tableNumber,
                                       TableInfoEnum.TAB_INFO_NUM);
     }

     ... rest of class, including RunTableInfoCommand(int,int);
}

Вы использовали бы его в качестве так:

IFoo foo;

if (tableNumber.HasValue)
{
    foo = new FooWithNumber( tableNumber.Value );
}
else
{
    foo = new FooWithName( tableName );
}

int number = foo.Number;

Очевидно, если у Вас нет большого количества конструкций if-then-else в Вашем существующем классе, это решение на самом деле не улучшает его очень. Это решение создает IFoo использование полиморфизма и затем просто использует методы интерфейса, не заботясь о реализации. Это могло легко быть расширено для наследования общей реализации RunTableCommand (интервал) в абстрактном классе, который наследовал IFoo и является базовым классом для FooWithNum и FooWithName.

0
ответ дан 5 December 2019 в 13:02
поделиться

как я осуществил бы рефакторинг их конкретные если операторы для использования полиморфизма?

Хорошо... Я не был бы. Вам не нужен полиморфизм для устранения если операторы.

Обратите внимание, что, если операторы как не 'плохо' по сути, если операторы вызываются выбором представления где

(internalTableNumber == null) ==> 
    internalTableName else internalTableNumber.Value

Эта ассоциация подразумевает недостающий класс, т.е. имело бы больше смысла иметь класс InternalTable, который владел internalTableName и internalTablenumber, так как эти два значения сильно связаны правилом пустой проверки.

  • Этот новый класс мог обеспечить свойство TableNumber, которое выполнило internalTableNumber == пустая проверка
  • и RunTableInfoCommand мог взять экземпляр InternalTable в качестве параметра (но он не имеет к, посмотрите следующий объект).
  • Но еще лучше, новый класс должен иметь фасад к методу RunTableInfoCommand (который, по-видимому, статичен), который выполнил целочисленное преобразование.

Принятие экземпляра InternalTable называют iTable, пересмотренный код беспокойства был бы затем похож:

public int Number
{
    get
    {
        return iTable.RunTableInfoCommand(TableInfoEnum.TAB_INFO_NUM);
    }
}

Это инкапсулировало бы пустую регистрацию класса InternalTable. Изменение исходной подписи RunTableInfoCommand является дополнительным.

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

0
ответ дан 5 December 2019 в 13:02
поделиться
Другие вопросы по тегам:

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