2010-11-25 3 views
5

시스템을 업그레이드 중이며 다른 개발자 코드 (ASP.NET은 C#)를 사용하고 있습니다.중복 코드입니까?

나는이 건너 온 :

private ReferralSearchFilterResults ReferralsMatched 
{ 
    get 
    { 
     if (Session[SESSION_REFERRAL_SEARCHFILTERRESULTS] == null || Session[SESSION_REFERRAL_SEARCHFILTERRESULTS].GetType() != typeof(ReferralSearchFilterResults)) 
      return null; 
     else 
      return (ReferralSearchFilterResults)Session[SESSION_REFERRAL_SEARCHFILTERRESULTS]; 
    } 
    set 
    { 
     if (value == null) 
     { 
      Session[SESSION_REFERRAL_SEARCHFILTERRESULTS] = value; 
     } 
     else if (value.GetType() == typeof(ReferralSearchFilterResults)) 
     { 
      Session[SESSION_REFERRAL_SEARCHFILTERRESULTS] = value; 
     } 
    } 

} 

불필요한 세터의 유형을 확인 있나요? 확실히 ReferralSearchFilterResults 객체가 아닌 다른 것으로 속성을 설정하면 코드가 컴파일되지 않습니다. 내가 뭔가를 누락되거나 건가요 만 사용하여 내가 바로이 달성 될 수있다 생각입니다 :

set 
{ 
    Session[SESSION_REFERRAL_SEARCHFILTERRESULTS] = value; 
} 
+0

:) 속성 값이 세션 변수에 저장되는 이유가 더 걱정됩니다. 내가 여기서 뭔가를 놓치지 않는 한. –

+0

이것은 나쁜 연습 IMO입니다. 어느 누구도 자신이 스스로 결정한 스마트 카스 속성을 좋아하지 않으므로 자신이 수행하도록 요청한 사항을 수행해서는 안된다는 사실을 사용자에게 알리지도 못합니다. – Groo

답변

3

원래의 코드를 설정하거나 또는 자산에서 얻을되는 ReferralSearchFilterResults의 서브 클래스를 방지 할 수 있습니다. value.GetType()value으로 참조되는 개체의 실제 Type을 반환하기 때문입니다. 해당 Type이 ReferralSearchFilterResults의 하위 클래스이면 typeof(ReferralSearchFilterResults)과 같지 않습니다.

본인의 컨텍스트가 확실하지 않으므로 올바른 동작인지 여부를 알 수 없습니다. 그것이 의도 된 행동이라면 서브 클래스의 할당을 자동으로 무시하기 때문에 약간 더러워집니다. 그러나 나는 더 이상의 맥락 없이는 정말로 판단 할 수 없다.

+0

하위 클래스가 부모 클래스 유형의 속성으로 설정 될 수 있다는 것을 알지 못했습니다. 다른 방법으로 생각했습니다. 어쩌면 조금 더 읽을 필요가 있습니다. 어쨌든, 나는이 대답에서 무언가를 배웠고 따라서 대답으로 받아 들였습니다. – Jamie

+0

속성은 상속 및 다형성을 처리하는 방식에서 특수하지 않습니다. 로컬 변수 나 필드와 마찬가지로 기본 유형의 참조에 서브 클래스를 지정할 수 있습니다. –

3

가 나는 당신이 옳은 것 같아요 - 암시 적 캐스트 할 수없는 그 무언가와 함께 제공되는 경우 세터가 컴파일되지해야 ReferralSearchFilterResults.

0

get bit의 형식 검사를 이해할 수 있지만, setter에서 컴파일시 코드가 실패하므로 ReferralSearchFilterResults가 아닌 것은 전달할 수 없습니다.

return Session[SESSION_REFERRAL_SEARCHFILTERRESULTS] as ReferralSearchFilterResults; 

이가 ReferralSearchFilterResults에 캐스트 할 수있는 경우 값을 반환, 그렇지 않으면 null 사용할 수 있으며, get의 경우

+0

사실, 그 사람은 약한 언어를 많이 사용하는 것 같습니다. –

3

(오래된 습관, 다른 개발자가 있었다 수 있을까).

1

제이미 당신 말이 맞아요. 이 경우에는 Setter의 유형 검사가 필요하지 않습니다. value이어야합니다. ReferralSearchFilterResults가되어야합니다.

다른 변경 사항은 Type 개 개체 대신 isas 키워드를 사용하는 것입니다.

private ReferralSearchFilterResults ReferralsMatched 
{ 
    get 
    { 
     if (Session[SESSION_REFERRAL_SEARCHFILTERRESULTS] == null || !(Session[SESSION_REFERRAL_SEARCHFILTERRESULTS] is ReferralSearchFilterResults)) 
      return null; 
     else 
      return Session[SESSION_REFERRAL_SEARCHFILTERRESULTS] as ReferralSearchFilterResults; 
    } 
    set 
    { 
     Session[SESSION_REFERRAL_SEARCHFILTERRESULTS] = value; 
    } 

} 
+0

Rik이 언급했듯이 getter 에서처럼 사용할 수 있습니다. –

+0

@Nathan Taylor : 예외 조항을 이해할 수 없습니다. 'FilterResults fr = null as FilterResults'라고 쓰면 예외를 던지지 않을 것입니다. 그래서 처음에'as' 키워드를 사용합니다. 이 예외는 어디에서 던져 질 것인가? – Groo

+0

@ Nathan : "초기화되지 않은"객체 란 무엇입니까? 그리고 어떤 예외는 던져 질 것인가? – Groo

1

세션 변수는 객체 유형이므로 세션 변수는 그 안에 무엇이든 저장할 수 있습니다. 그러나이 경우 setter 자체는 프로그래머가 ReferralSearchFilterResults 및 파생 된 객체보다 다른 객체 유형을 할당하는 것을 방지합니다. 그래서 당신이 지적한 바와 같이 그 자체가 불필요합니다. 또한 프로그래머가 ReferralSearchFilterResults에서 파생 된 객체를 할당하도록 허용하지 않습니다.

하지만 null로 설정된 경우 세션 변수가 HTTP 컨텍스트에 계속 존재하기 때문에 변수를 null로 설정하는 대신 Session.Remove를 사용합니다. 그래서

는 :

set 
{ 
     if (value == null) 
      Session.Remove(SESSION_REFERRAL_SEARCHFILTERRESULTS); 
     else 
      Session[SESSION_REFERRAL_SEARCHFILTERRESULTS] = value; 
} 
관련 문제