“TryParse / Синтаксический анализ как” шаблон: что лучший способ состоит в том, чтобы реализовать его

HTML:

<div class="indexVideoText">
sometext
</div>
<div class="videoContainer">
<iframe title="hQ6TSIFM8I0" width="80%" height="80%" frameBorder="0" src="https://www.youtube-nocookie.com/embed/hQ6TSIFM8I0?autoplay=1&amp;loop=1&amp;playlist=hQ6TSIFM8I0&amp;origin=bellroy.com&amp;modestbranding=1&amp;showinfo=0&amp;rel=0&amp;version=3&amp;mute=1"></iframe>

</div>

CSS

.indexVideoText{
    position: relative;
    font-family: "PT Serif", serif;
    -webkit-font-smoothing: antialiased;
    text-align: center;
    margin: 5px auto 20px auto;
    font-weight: 400;
    /* line-height: 32px; */
    color: #666;
    font-weight: 500;
    font-size: 25px;
    line-height: 40px;
    margin: 0 auto 40px auto;
    max-width: 55%;
    top:50px;
}
.videoContainer{
    position:relative;      
    height:500px;
    overflow:hidden;
    border:1px solid black;
  background-color:red;
  padding-top:20px;
  padding-bottom:20px;
}
 iframe{
    position:absolute;
    margin: auto;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
    width:70%;

}
9
задан Community 23 May 2017 в 10:29
поделиться

4 ответа

Создание TrySomething просто поймать и глотать исключение является действительно плохой идеей. Половина точки шаблона TryXXX должна избежать хита производительности исключений.

Если Вам не нужно много информации в исключении, Вы могли бы сделать метод DoSomething просто назвать TrySomething и выдать исключение, если это перестало работать. При необходимости в деталях в исключении Вам, возможно, понадобится что-то более тщательно продуманное. Я не синхронизировал, где объем хита производительности исключений - если это - бросок, а не создание, Вы могли бы записать закрытый метод, который имел подобную подпись к TrySomething, но который возвратил исключение или пустой указатель:

public int DoSomething(string input)
{
    int ret;
    Exception exception = DoSomethingImpl(input, out ret);
    if (exception != null)
    {
        // Note that you'll lose stack trace accuracy here
        throw exception;
    }
    return ret;
}

public bool TrySomething(string input, out int ret)
{
    Exception exception = DoSomethingImpl(input, out ret);
    return exception == null;
}

private Exception DoSomethingImpl(string input, out int ret)
{
    ret = 0;
    if (input != "bad")
    {
        ret = 5;
        return null;
    }
    else
    {
        return new ArgumentException("Some details");
    }
}

Время это перед согласием на него хотя!

14
ответ дан 4 December 2019 в 10:06
поделиться

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

public object DoSomething(object input){
  return DoSomethingInternal(input, true);
}

public bool TryDoSomething(object input, out object result){
  result = DoSomethingInternal(input, false);
  return result != null;
}

private object DoSomethingInternal(object input, bool throwOnError){
  /* do your work here; only throw if you cannot proceed and throwOnError is true */
}
3
ответ дан 4 December 2019 в 10:06
поделиться

Принятие этого является C#, я сказал бы второй пример

public bool TrySomething(string a, out result)
{
    try
    {
        result = DoSomething(a)
        return true;
    }
    catch (Exception)
    {
        return false;
    }
}

Это подражает встроенному int.TryParse(string s, out int result), и по-моему его лучшее для пребывания согласовывающимся с языком/средой.

2
ответ дан 4 December 2019 в 10:06
поделиться

Первый пример корректен, если Вы просто собираетесь поймать исключение и не сделать, почти возвращают false с ним.

Вы могли изменить TrySomething для сходства с ниже.

public bool TrySomething(string a, out result, bool throwException)
{
  try
  {
    // Whatever
  }
  catch
  {
    if(throwException)
    {
      throw;
    }
    else
    {
      return false;
    }
  }

}

public bool TrySomething(string a, out result)
{
  return TrySomething(a, out result, false);
}

Таким образом, DoSomething был бы похож

public int DoSomething(string a)
{
  int result;

  // This will throw the execption or 
  // change to false to not, or don't use the overloaded one.
  TrySomething(a, out result, true) 

  return result;      
}

Если Вы не хотели TrySomething с throwException, выставленным общественности, можно сделать это членом парламента, не занимающим официального поста.

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

2
ответ дан 4 December 2019 в 10:06
поделиться
Другие вопросы по тегам:

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