2017-11-02 30 views
-1

어디서나 사용되는 함수에 새로운 선택적 매개 변수를 추가하면 대규모 프로젝트의 기존 코드가 폭탄을 터질 위험이 있습니까? 대신에 함수에 과부하를 걸고 위험을 최소화 할 수 있지만 실제로는 선택적 매개 변수를 사용하는 것이 위험 할 수 있습니다.VB.NET 함수에 선택적 매개 변수를 추가하여 기존 코드를 위반할 가능성이 있습니까?

다음은 예입니다 :

Public Function GetContent(ByVal URL As String, ByVal ID As String, Optional ByRef PageTitle As String = "") As String 
     Try 
      Dim web As New HtmlWeb() 
      Dim doc As HtmlDocument = web.Load(URL) 
      ID = "//div[@id='" & ID & "']" 
      Dim ContentNode As HtmlNode = doc.DocumentNode.SelectSingleNode(ID) 

      ' The two lines below are the mere extent of what's new inside this function, besides the new Optional ByRef parameter in its signature 
      Dim PageTitleNode As HtmlNode = doc.DocumentNode.SelectSingleNode("//title") 
      If Not PageTitleNode Is Nothing Then PageTitle = PageTitleNode.InnerHtml 

      Return ContentNode.InnerHtml 

     Catch ex As Exception 
      Return "<h4> Bad. Very bad. </h4>" 
     End Try 
    End Function 

PS : 나는, 사실 후 내 질문에 대해 언급하고 싶습니다 아래 다른 사람의 응답을 읽은 일부 추가 연구 자신을 수행하는 데. 원래 선택적 매개 변수를 사용하는 접근 방법의 유효성에 대해서는 질문하지 않았습니다. 그게 VB.NET에서 할 수있는 일이었고, 나는 모든 권리가 있음을 느꼈다. 게다가 그것은 매우 편리했다! 그러나 원래의 질문은 컴파일부터 실행까지 선택적 매개 변수가 구현되는 방법에 차이가 있는지 여부와 관련이 있습니다. 코드를 설계 할 때 고려해야 할 차이가 있습니다. 과부하 접근법과 관련하여 선택적 매개 변수 접근법의 역사적 중요성을 알지 못했습니다. 나는 옵션 매개 변수 접근법에 결함이나 결함이있는 것이 아니라는 것을 알게되었다. 오히려 공통 언어 런타임 (Common Language Runtime)의 출현으로 간단하게 재정의 된 여러 다른 관심사에 맞게 고안된 솔루션이었습니다. VS2013을 사용하고 있습니다. 물론 모든 것이 선택적 매개 변수 접근법으로 잘 컴파일되어 실행되는 것처럼 보였습니다. 그러나 선택적 매개 변수를 추가하여 잠재적으로 다른 것을 깨뜨리지 않는지 확인하고 싶었습니다. 특히 누군가가 내 코드를보고 대신 함수 오버로드를 제안했기 때문입니다. . 나는 왜 내가 선택적 매개 변수 방법을 유지하면 안되는 지 증명하고 싶었다. 제임스 소프 (James Thorpe)는 저의 질문에 지금 대답했습니다. 그러나 Tim Schmelter가 질문했듯이 과부하 접근법과 반대로이 방법 (옵션 매개 변수)을 수행하는 것이 이점이 있습니까? 나에게 이제는 과부화 접근 방식이 가장 좋고 유일한 방법 인 것 같습니다. Microsoft의 이전 구성 요소 개체 모델 (COM)에 구현 된 선택적 매개 변수 접근 방식을 사용하는 새로운 기술 집합을 사용하고 있기 때문입니다. 해결하기 위해 고안된 것입니다 (책의 83 페이지, "Microsoft Visual C# 2013 Step By Step" by John Sharp 참조). 특히, 이전 함수 시그니처 (예 : 새로운 선택적 매개 변수를 추가하기 전에 존재했던 함수 매개 변수 레이아웃)를 찾을 외부 모듈이있는 경우에는 다시 컴파일하지 않으면 중단됩니다. 그것은 저를위한 방해물입니다. 그러나 오버로드는 재 컴파일을 필요로하지 않고이 소프트웨어 개발 문제를 훨씬 잘 처리합니다. 새로운 Common Languange Runtime (CLR)에서만 지원됩니다. VB.NET의 선택적 매개 변수 지원은 이전 COM 일의 역사적인 한계점에 더 가깝습니다. 내 특정 요구 사항에 가장 적합한 솔루션이 아닙니다. 또한 "모든 언어에서 지원해야하는 CLR의 하위 집합을 정의하는 공용 언어 사양 (Common Language Specification)은 선택적 매개 변수에 대한 의존성을 명시 적으로 허용하지 않습니다. 즉, 기본 클래스 라이브러리에서 사용할 수있는 후보가 아닙니다. .NET Framework의 일부로 출하 된 다른 라이브러리에서 볼 수 없었을 것입니다. " (온라인 기사, "Optional Parameters Are Gaining Ground in .NET", by Jonathan Allen). Microsoft 기술을 사용하는 일반 개발자는 규칙이 더 느리지 만 선택적 매개 변수에 의존하지 않도록 내부 결정을 내릴 때 뭔가가 있다고 생각합니다. 나는 단지 당신이 여기에 와서 궁금해지기를 원한다면 당신과 함께 게시하고 공유하기를 원했습니다!

+0

새로운 선택적 매개 변수가 기능을 추가하는 경우에만 매개 변수와 상관없이 기존 기능을 변경하면 문제가 발생할 수 있습니다. – Icepickle

+0

"폭탄"이라면 위험이 아니라 "폭탄" 당신은 당신이 그걸 가지고 도망하지 않았다는 것을 알게 될 것입니다. 보증을받을 수 없으며 모든 것을 다시 컴파일해야합니다. –

+0

오른쪽. 그리고 코드의 기능을 변경하는 것이 아니라 함수 내부에서 수행해야했던 모든 것을 변경하지 않는 새로운 선택적 기능을 추가하는 것입니다. 내 유일한 관심사는 다른 곳에서 코드를 호출하는 다른 코드가 딸꾹질을 일으킬 가능성이 있는지 여부입니다. 코드가 호출되는 방식에 따라 다양한 소스가 있다는 것을 알고 있습니다. – ShieldOfSalvation

답변

4

단일 프로젝트 내에서? 아니, 괜찮을거야. 그러나 의견에서 당신은 말했다 :

다른 프로젝트 (가능성이있다)가 있다고 가정 해 봅시다. 내가 그들을 재건하지 않으면 그것들을 깨뜨릴까요?

선택적 매개 변수는 실제로 컴파일시에 구운된다, 그래서 당신은 원래 메소드 서명이있는 경우 :

Public Function GetContent(ByVal URL As String, ByVal ID As String) 

그리고 사람을 thusly 히를 호출 :

GetContent(someUrl, someId) 

이 그것은 컴파일됩니다 그대로 조립품에 넣습니다. 새 선택적 매개 변수로 매개 변수를 전달하지 않고 위와을 호출 아무것도 사실로 컴파일 얻을 것이다 :. 선택적 매개 변수의 기본값이 자동으로 가져왔다 얼마나

GetContent(someUrl, someId, "") 

참고 모든 것을 재건하는 경우 , 전부다 괜찮아. 그러나 을 참조하는 프로젝트에서는 다시 작성되지 않습니다., 원래 두 매개 변수 호출을 갖습니다. GetContent 메소드는 이제 런타임에 3 개의 매개 변수가 필요합니다. 2 개의 매개 변수를 사용하는 함수의 오버로드를 찾을 수 없으므로 런타임 오류가 발생합니다. 여기

+0

그거 끔찍해. 그래서 CLR이나 .NET Framework의 어떤 것도이 문제를 발견하고 오류를 던지지 않고 동적으로 해결합니다. – ShieldOfSalvation

+0

@ShieldOfSalvation 아무것도 알지 못합니다. 아니요, –

+0

그렇다면 기존 매개 변수에 선택적 매개 변수를 도입하는 데 큰주의가 필요합니다. 그것은 Microsoft 문서의 어딘가에 기록되어야합니다, 나는 희망합니다. 아직 찾지 못했습니다. "선택 매개 변수는 Visual Basic에서 .NET 1.0 이후로 이미 정의 될 수 있습니다.", Microsoft (https://connect.microsoft.com/VisualStudio/feedback/details/614070/c-optional-parameter-ambiguous -call-compile-time-warning-needed). – ShieldOfSalvation

2

은 ... 파괴 코드없이

Public Function GetContent(ByVal URL As String, ByVal ID As String, ByRef PageTitle As String = "") As String 
    ' the rest of your function here 
End Function 

Public Function GetContent(ByVal URL As String, ByVal ID As String) As String 
    Return GetContent(URL, ID, "") 
End Function 

당신이 3

와 기존 코드 2 개 매개 변수와 함수의 버전과 하나가 그런 식으로 그것을 할 수있는 방법은 당신이하는 경우

<Obsolete("Use the version that takes pageTitle as a 3rd parameter"> 
Public Function GetContent(ByVal URL As String, ByVal ID As String) As String 
    Return GetContent(URL, ID, "") 
End Function 

당신에게 당신이 경우 컴파일러 경고를 줄 것이다 : 3 매개 변수 버전으로 전환하는 프로그래머를 장려 할, 당신은이 같은 두 매개 변수의 버전을 표시 할 수 있습니다 2- 매개 변수 버전을 호출하십시오.

+1

이것은 제 코딩 문제에 대한 훌륭한 해결책입니다.하지만 원래의 질문에서 저는 함수 오버로딩이 있다는 것을 알고 있지만 StackOverflow 포스트를 사용하면 선택적인 매개 변수 라우트가 본질적으로 결함이 있거나 부적절한지를 정리하고 싶습니다. - 지금까지는 그런 것 같습니다. – ShieldOfSalvation