2014-10-21 3 views
0

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

Интересно, какой лучший подход для этого сценария. У меня была функция, которая должна была рассчитывать параметр, основанный на некоторых данных, которые также были подсчитаны.

private float CountAvailability(DateTime startDate, DateTime endDate, string machine) 
{ 
     float value=0; 

     float machineUptime = _repostory.Select(machine); 

     float machineDownTime = _repostory2.Select(machine); 

     value = machineUptime *machineDownTime ; 

     //some other magic here 

     return value; 
} 

Из coruse это пример кода, и на самом деле он намного сложнее.

Теперь я использую эту функцию еще в нескольких других местах моего кода, и теперь вам нужно передать еще несколько параметров. Я бы предпочел не пересчитывать их снова в другом месте, и я не хочу повторять свой код, чтобы создать копию этой функции только для этой цели, поэтому я подумал об использовании ref или out.

private float CountAvailability(DateTime startDate, DateTime endDate, string machine, 
           ref float machineUptime , ref float machineDownTime) 
{ 
     float value=0; 

     float machineUptime = _repostory.Select(machine); 

     float machineDownTime = _repostory2.Select(machine); 

     value = machineUptime *machineDownTime ; 

     //some other magic here 

     return value; 
} 

Теперь я могу получить некоторые другие параметры из функции. Единственная проблема в том, что я не хочу этого делать в любом месте, где я использую эту функцию.

Некоторые из мест, это так

CountAvailability(tempStartDate, tempEndDate, machine , ref machineUptime, ref machineDownTime) 

и в других функции должны оставаться одинаковыми.

CountAvailability(tempStartDate, tempEndDate, machine) 

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

С уважением!

ответ

2

Самое простое решение (с точки зрения изменения очень мало кода) будет иметь перегрузку:

private float CountAvailability(DateTime startDate, DateTime endDate, string machine) 
{ 
    float ignored1 = 0f, ignored2 = 0f; 
    return CountAvailability(startDate, endDate, machine, ref ignored1, ref ignored2); 
} 

Однако, вы должны сделать эти out параметры вместо ref параметров, как вы не используете существующая стоимость.

Вы также следует рассмотреть изменение метода к чему-то вроде:

private Availability GetAvailability(DateTime startDate, DateTime endDate, 
            string machine) 

где Availability будет включать в себя все, что вы в настоящее время с указанием с возвращаемым значением и out параметров. Тогда вам не нужна перегрузка - вы просто игнорируете любые биты результата, который вам неинтересен. (Это означает, что, конечно, потерянная работа ... если дорого вычислить одну из тех частей информации, которая не является используется, вы можете захотеть рассмотреть альтернативные стратегии.)

+0

Ну, я думаю, я поеду с возвратом объектного подхода, так как это сделает код более читаемым. Большое спасибо Jon :) –

 Смежные вопросы

  • Нет связанных вопросов^_^