2013-09-23 2 views
2

, поэтому мне было интересно, что является самым правильным способом определения длины. Сейчас я использую что-то вроде этогоПравильный способ определить длину

Coordinates(4.00 * Length.Millimeter, 5 * Length.Millimeter) 

Я задавался вопросом, должен ли я извлечь это в метод, как этот

getMillimeter(double value) return value; 
Coordinates(getMillimeter(4.00), getMillimeter(5.00); 

Theres также возможность найти способ сделать это тоже? (Я работаю в C#)

Coordinates(4.00mm, 5.00mm) 

Я понимаю, каким образом вы определяете это ситуативно, но, не зная ситуации, какой метод (или что метод) кажется, наиболее подходящий метод?

* edit - Мне просто интересно, какой метод лучше всего смягчит запах кода «Magic Number»? Прямо сейчас я думаю, что создание новой структуры Length сделало бы трюк, так как вы передаете свое магическое число в фактический класс с переменной, выделенной для него.

ответ

3

Есть ли возможность найти способ сделать это тоже? (я работаю в C#)

В C# нет языковой поддержки встроенных модулей (в отличие от F#, which does support this).

Распаковка в Length класс действительно обеспечивает вам безопасность, хотя я, как правило, сделать это с помощью фабричного метода, а именно:

// Method defined as Coordinates(Length, Length), not using double directly 

Coordinates(Length.FromMillimeters(4.00), Length.FromMillimeters(5.00)); 

Это позволяет легко и безопасно смешивать единицы длины, то есть:

Coordinates(Length.FromMeters(0.004), Length.FromMillimeters(5.00)); 
+0

'Length.FromMillimeters (4,00)' кажется гораздо более показателен намерение, чтобы быть по сравнению с '4,00 * Длина. Миллиметр'. Также придерживается соглашения .net, например 'TimeSpan.FromHours' –

0

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

0

Экстракт к способу по следующим причинам:

  • повторного использования кода через приложение
  • легче модульного тестирования
  • единый принцип ответственности (SRP)
1

Вы можете создать свой собственный Length класс для обработки создания значения длины из данного блока и преобразование в любой данной единицы из это значение:

public struct Length 
{ 
    private double millimeters; 

    public double Millimeters { get { return millimeters; } } 
    public double Meters { get { return millimeters/1000; } } 

    public static Length FromMillimeters(double value) 
    { 
     return new Length() { millimeters = value }; 
    } 
    public static Length FromMeters(double value) 
    { 
     return new Length() { millimeters = value * 1000 }; 
    } 
} 

Вы можете добавить методы/свойства создания/извлечения для любых единиц, которые хотите поддержать.

Если возможно, ваш класс Coordinates затем примет два объекта Length, вместо того чтобы полагаться на вызывающего абонента, просто «зная», что пройденные парные разряды должны быть в миллиметрах.

0

Вы можете также использовать и метод расширения, если вы хотите, чтобы сделать вещи читать немного лучше:

public static class Extensions { 
    public static double MM(this double val) { return val; // or whatever } 
} 

, который позволяет писать код, как:

Coordinates(4.00.MM(), 5.00.MM()); 

Что может читать немного лучше, но на самом деле не дает безопасности типа (например, F #).

1

Этот вопрос не имеет большого смысла, не имея представления о том, что представляет собой 4.00.

Самое главное, если вы хотите избавиться от магических чисел, то вы используете константы:

const double DefaultXValue = 4.00; 
const double DefaultYValue = 5.00; 

И тогда вы можете позвонить:

Coordinates(DefaultXValue, DefaultYValue); 

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

Предположим, что ваш блок по умолчанию - миллиметры, и вы хотите работать в дюймах. Тогда вы бы написать что-то вроде:

const double LengthInInches = 100; 

И вы бы метод, InchesToMillimeters, который преобразует дюймов в миллиметры. И, вероятно, еще один метод под названием MillimetersToInches.

Так что если вы хотите, чтобы дать X, Y координаты в дюймах, а не миллиметрах:

Coordinate(InchesToMillimeters(XInches), InchesToMillimeters(YInches)); 
Смежные вопросы