2016-11-24 3 views
2

Так что я долгое время боролся с этим.
Я пытаюсь узнать ООП, но это настолько велико, что мне трудно хотя бы понять все это.
Предположим, у меня есть метод в классе, который получает что-то из базы данных.
Эти данные будут установлены в переменную.
Теперь у меня есть общедоступный метод, вызывайте его, а затем вызывайте аксессуар со значением. Например:
Вызов метода внутри аксессора C#

 private string _name; 

     public string Name { get { return _name; } } 

     public void MyMethod() 
     { 
      using (SqlConnection connect = new SqlConnection(connectionString)) 
      { 
       using (SqlCommand command = new SqlCommand("SELECT Name FROM Table WHERE ID = 1", connect)) 
       { 
        connect.Open(); 
        using (SqlDataReader reader = command.ExecuteReader()) 
        { 
         if (reader.Read()) 
         { 
          _name = Convert.ToString(reader["Name"]); 
         } 
        } 
       } 
      } 
     } 

И я бы назвал это нравится:

MyClass myclass = new MyClass(); 
myclass.MyMethod(); 
string myname = myclass.Name; 

Теперь это кажется очень странным для меня.
Так что я подумал, может быть, стоило бы назвать метод внутри аксессора.
Как:

public string Name { get { MyMethod(); return _name; } } 

Вызова это нравится:

MyClass myclass = new MyClass(); 
string myname = myclass.Name; 

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

Мне очень хотелось бы услышать от вас, ребята! Пожалуйста, не стесняйтесь задавать вопросы или вносить изменения в мой вопрос.
Кроме того, мои искренние извинения, если это уже было задано.
Любые отличные уроки также очень приветствуются!

+0

Как ваш MyMethod означает, что у него нет параметров, поэтому вы можете вызвать его из своего конструктора, тогда он будет устанавливать имя и имя доступно. Вы также можете иметь имя возврата MyMethod, а также задать имя в случае необходимости забрать его позже .. MyMethod может, конечно, вернуть строку .. так что вы можете сделать String myname = myclass.MyMethod(); есть много вариантов, один выбрать, зависит от того, что еще вам нужно, чтобы сделать, что еще ваш класс собирается делать.Вы также можете поставить публичную строку Name {get {myMethod(); }}, если она вернула строку. – BugFinder

+0

Вы назначаете 'Name'' _name', которое является частным полем, оно недоступно вне класса. – abdul

+0

@abdul вам не хватает, что есть открытый аксессор. – Jamiec

ответ

3

Что вы реализуете это форма Lazy Evaluation , который иногда называют кэшируются свойству

Общая картина дизайн:

private SomeType _value; 
public SomeType CachedProperty { 
    get { 
      if(_value == null) { 
       _value = GetValue(); // slow 
      } 
      return _value; 
    } 
} 

Существует несколько причин, которые препятствуют понятие этого вид недвижимости:

  • GetValue() is typi так медленно. Вот почему мы оцениваем его ценность в первую очередь. Таким образом, доступ к собственности происходит только при первом вызове. Но Мы ожидаем, что свойство будет всегда быстро.

  • Кассовое значение может быть устаревшим к моменту его повторного использования. Это можно смягчить с помощью общедоступного метода, например UpdateValue. Но Мы ожидаем, что свойство будет всегда актуально.

  • Если вы опустите проверку _value == null, то это свойство станет оберткой для метода . Почему мы вообще используем собственность?

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

Действительно ли вы действительно хотите это сделать, зависит от требований окружающего вас кода.

Но в целом я бы просто пойти с типичным образцом асинхронном:

public SomeType GetValue() { ... } 
public Task<SomeType> GetValueAsync() { ... } 

и если вам действительно нужно работать с закэшированным значением на различных областях добавить:

public SomeType CachedValue { get; } 

Это проясняет что значение, которое вы получаете «быстрый способ», может быть устаревшим.

+0

Большое спасибо за объяснение, я обязательно посмотрю на это. – Sj03rs

1

Важно отметить, что эти 2 вещи (объект, содержащий ваши данные и способ получения этих данных) - это две разные проблемы. Хорошая практика диктует, что ваши классы имеют separation of concerns.

В вашем случае у вас должен быть класс "repository", который знает, как получить данные из базы данных и DTO (или, просто, Object), который обладает свойствами. Ваш репозиторий, скорее всего, загрузит все необходимые данные и вернет объект со всеми присутствующими данными.

+0

Спасибо за быстрый ответ, я прочитаю связанные страницы. Это, безусловно, поможет мне! – Sj03rs

3
  • Вы можете рассмотреть возможность запуска метода в ctor один раз.

  • У вас может быть общедоступный метод RefreshData, который обновит все, что вам нужно от db.

  • У вас может быть свойство, проверяющее, является ли _name нулевым, и только если он - он будет обновлять его из базы данных и затем возвращать, иначе он просто возвращает существующее значение. Вы можете комбинировать это с методом Invalidate, который установит _name и любой другой соответствующий член на нуль или какое-либо другое указание, чтобы заставить их свойства действительно повторно вызвать функцию обновления при их следующем вызове.

В реальных случаях вы, как правило, знаете, что лучше подходит, но все они ООП.

Однако предлагаемое решение несколько противоречит принципам ООП, поскольку, вероятно, не должно быть обнаружено MyMethod, и ваш класс, вероятно, является тем, кто несет ответственность за его данные.


Кроме того, как ответ Jamiec предполагает, вы должны реализовать DB-связанной логики в других местах, в Repository классе или даже целый слой (отдельный проект иногда) только для этого (ищите DAL). Это связано с тем, что, хотя ваш класс может нести ответственность за свои собственные данные, он не должен «ничего знать» о базах данных или языках запросов. Максимум - он знает, как задавать что-то независимое от него для некоторых данных.

+0

Хорошо, большое спасибо, это поможет мне много! – Sj03rs

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