지금 직장에서 동료와 다툼을했습니다. 동료가 너무 일반적입니다 .

페이지에 3 가지 모드 (단순, 고급 및 특수)-사양 작성 방법을 선택하지 않기 때문에 이와 같이 작동해야합니다. 각 모드에서 페이지가 다르게 보입니다. (변경 사항이 크지 않음- 5 개의 텍스트 필드를 다른 모드에 따라 조합).

제 동료가 3 페이지 여야한다고 생각하며 변경 사항을 변경하려면 다른 두 모드의 변경 사항을 병합 해야합니다.

이제 필드에 코드가 있습니다. rendered="#{mode!=2}"

PS 이제 차이는 5 개 필드이지만 미래에 얼마나 변경 될지 알 수 없습니다. .


Seam (JSF / Facelets)을 사용합니다. 다음은 의사 facelet 코드입니다 (이해하기 쉽게 만들기 위해). 문제를 더 잘 나타 내기 위해 panelGroups에 넣지 않았습니다.

<h:output rendered="mode=2" value="Name: " /> <h:input rendered="mode=2" value="bean.name" /> <h:output rendered="mode=2" value="Surename: " /> <h:input rendered="mode=2" value="bean.surname" /> <h:output rendered="mode!=2" value="Surename: " /> <h:input rendered="mode!=2" value="bean.surname" /> <h:output rendered="mode!=2" value="#{mode==1?"My Name":"My friends name"}" /> <h:input rendered="mode!=2" value="bean.name" /> 

다음과 같은 버전을 복제했습니다 (의사 코드)

<c:if test=mode=1> <ui:include view=modeSimple.xhtml> </c:if> <c:if test=mode=2> <ui:include view=modeAdv.xhtml> </c:if> <c:if test=mode=3> <ui:include view=modeSpec.xhtml> </c:if> modeSimple.xhtml <h:output value="Surename: " /> <h:input value="bean.surname" /> <h:output value="My Name" /> <h:input value="bean.name" /> modeAdv.xhtml <h:output value="Name: " /> <h:input value="bean.name" /> <h:output value="Surename: " /> <h:input value="bean.surname" /> modeSpec.xhtml <h:output value="Surename: " /> <h:input value="bean.surname" /> <h:output value="My friends name" /> <h:input value="bean.name" /> 

댓글

  • 이 예에서는 ” < h : output rendered = ” mode! = 2 ” value = ” bean.nameLabel ” / > “?
  • @ Lenny222 레이블을 하드 코딩하지 말고 데이터와 함께 보관해야한다고 말씀 하셨나요? : | 아니면 내가 i18n을 사용해야한다고 말하는 건가요? 귀하의 코드에서 데이터를 출력하려는 것을 이해하지만 이것은 레이블이있는 양식입니다.
  • 나에게 템플릿은 오히려 정적이어야합니다. (비즈니스) 로직이 템플릿에 들어온다는 인상을 받았습니다. 어쨌든 로직을 처리하기 위해 코드를 사용하기 때문에 (비정상적으로 Bean), 가능하면 비즈니스 로직을 처리하는 것이 좋습니다.
  • ” 이해하기 쉬운 코드 ” 구문이 잘못된 것으로 판명 될 수 있습니다.
  • @ Lenny222 양식이 정적이고 데이터를 제출하지 않아야한다고 생각하십니까? 그럼 왜 양식을 사용합니까? 테이블은 정적 데이터 용입니다.

답변

프로그래밍 할 때와 동일한 규칙을 사용하여 템플릿을 구성해야합니다. 이는 기본적으로 공통 디자인 요소를 별도의 파일로 추출하여 중복을 방지하여 더 재사용 가능한 디자인을 얻는 것을 의미합니다. 이것이 규칙 # 1 ( DRY )이며이 메서드는 프로그래밍 용어로 리팩토링이라고합니다.

두 번째 규칙은 노력해야한다는 것입니다. 단순성과 명확성. 레이아웃과 변경이 필요한시기를 쉽게 이해할 수 있어야합니다.

편지의 첫 번째 규칙을 따르면 GUI가 많은 작은 조각으로 많이 분해되어 레이아웃이 어떻게 생성되는지 이해하기 어려울 수 있습니다. 물건이 어디에 있는지 찾기 위해 많이 사냥해야합니다. 이것은 두 번째 규칙에 위배되므로 이 두 상반되는 것 사이의 균형을 찾아야합니다.

하지만 가장 좋은 방법은이 문제를 완전히 피할 수있는 솔루션을 찾는 것입니다. 이 경우에는 보다 간단한 접근 방식을 모두 고려해야합니다 . 나는 이것이 HTML이라고 가정하고 GUI에서 “단순 및 고급”상태를 언급합니다. 항상 모든 필드를 생성 한 다음 자바 스크립트에서 GUI 로직을 처리하는 것을 고려해 보셨습니까? 즉, 어떤 모드 (상태)에 따라 관련 필드를 즉시 숨기고 표시하는 클라이언트 측 코드를 작성합니까?

이것은 또한 서버를 사용하지 않고 필요에 따라 모드를 전환 할 수 있다는 이점이 있으며 어떤 규칙도 타협 할 필요가 없습니다. 또 다른 좋은 점은 프런트 엔드 직원이 일반적으로 디자인과 상호 작용을 조정하고 다듬는 데 지나치게 시간을 소비하지 않는 백엔드 프로그래머를 개입시키지 않고도 이러한 변경을 수행 할 수 있습니다.

댓글

  • JS가 더 간단하다는 데 동의하지 않습니다. 그 이유는 무엇입니까? 대부분의 동료가 ‘ JS 및 Java 웹 프레임 워크를 점점 더 모르기 때문에 JS (Richfaces, GWT)를 무시할 수 있습니다. ). 거의 모든 회사가 JS에 대해 관심이 없습니다 (저는 제가 인터뷰 한 모든 회사에서 JS 질문 하나를받은 것 같습니다). 따라서 동료들은 해당 코드를 건드리지 않고 코드가 있으면 다시 작성합니다. 당신의 아이디어는 좋지만 현실적이지는 않습니다. 그리고 왜 당신의 로직의 일부를 자바로, 일부를 JS로 유지합니까? 저장 프로 시저가 죽은 이유라고 생각합니다. ke 그들).
  • @ 0101 ‘ JS가 그 어떤 것보다 더 간단하거나 어렵다고 말하지 않았습니다. 그것은 당신의 기술에 달려 있습니다. 유능한 html 코더가 있으면 문제가되지 않습니다. 나는 GUI 문제를 GUI 계층 (그것이 속한 곳)으로 연기함으로써 종종 훨씬 더 간단한 해결책을 얻게된다고 말했습니다. 이는 GUI가 매우 동적이고 상호 작용 적이며 JS와 같은 언어를 위해 만들어 졌기 때문입니다. ” 어떤 회사도 JS를 신경 쓰지 않는다고 ” 생각하기 때문에 ‘ 내 요점은 덜 타당합니다.
  • 나는 그 종류의 일이라고 생각합니다. 질문은 내 상황에서 무엇을해야 하는가이며 귀하의 대답은 ” 저장 프로 시저 사용 ” 그리고 아무도 그것을 사용하지 않기 때문에 유효하지 않으며 내가 왜 그것을 사용했을지 이해하기 어려울 것입니다. 저는 ‘ 어떤 방법이 미래에 더 나은지 묻습니다. ‘ 내 선택이 최선인지 100 % 확신하지 못하기 때문에 (현재 가장 좋은 방법은 성가신 동료를 무시하는 것입니다.)
  • @ 0101 : 웹 및 HTML 작업은 자바 스크립트 (및 HTTP, CSS 및 이미지 …)를 의미하므로 ‘ JavaScript가 옵션이라고 가정 한 것에 대해 저를 비난하지는 않습니다. ‘ ‘ Swing에서 작성하라고 요청하는 것과는 다릅니다.
  • ” 거의 모든 회사는 JS에 관심이 없습니다 “-진지하게 믿으십니까? 웹의 풍부한 인터페이스는 수년 동안 클라이언트 쪽 방향으로 이동해 왔습니다. 이 보트를 놓치고 계신 것 같습니다.

답변

코드가 보이지 않으면 추측하지만 현재 귀하의 코드는 “가장자리에 있습니다”라고 생각합니다.

두 가지 또는 세 가지 모드의 경우 이러한 모드간에 변경 사항이 제한되어 있습니다. 이제 아마 괜찮습니다. 그러나 그것이 더 복잡하다면 별도의 페이지로 리팩토링되어야하는 것처럼 들립니다.

개인적으로 저는 이해하기 쉬운 코드를 선호합니다. 다른 개발자와 자신 모두에게 훨씬 더 유지 관리가 용이합니다. 6 개월 후에 다시 선택해야합니다.

그러나 미래에 존재하지 않을 수있는 문제를 해결하기 위해 코드를 지금 리팩토링하는 것은 의미가 없습니다. . 당신은 “요구 사항이 얼마나 변경 될지 모른다”고 말했고-그것은 변경을 포함하지 않습니다-그래서 YAGNI (You Ain “t Gonna Need It)를 적용하는 것은 지금 아무것도하지 마십시오.

코드를 다음과 같이 표시하십시오. 나중에주의가 필요하므로 잊지 말고 지금 변경 (그리고 잠재적으로 중단)하지 마십시오.

댓글

  • + 1-의심 스러우면 이해하기 쉽게 진행합니다. 일반화해야하는지 여부에 대한 생각의 잔소리는해서는 안된다고 말하는 본성적인 방법입니다. ‘

답변

저는 거의 같은 일을했습니다. 저를 믿으십시오. 각 모드에 대해 몇 가지 다른 동작을 구현 한 후에는 “메인 페이지”가 거의 읽을 수 없게됩니다. 그러면 여러 제어 흐름 블록 만 표시됩니다 (곧 Matrix 디지털 레인이 뒤 따름). 특정 모드의 내용을 명확하게보기 위해 일부 블록을 제거했습니다.

따라서 “분리 된 페이지”를 사용하는 것이 좋습니다. 그러나 그렇게 할 때는 ” 싸움 “코드 중복 문제입니다. 이것은 당신의 동료가 병합을 제안함으로써 틀렸을 수있는 곳입니다. 슬프게도 저는 그렇게했습니다. 기본적으로 작동하지만 귀중한 시간을 많이 소비하고 결국 페이지의 “공통 영역”이 제대로 병합되지 않아 병합이 정말 악몽이됩니다. 따라서 합리적 솔루션으로서 병합을 반대하는 것이 옳습니다.

많은 응답에서 알 수 있듯이 올바른 접근 방식은 진정한 “공통”부분을 외부 엔티티 (JSP 페이지 조각, JSF 스 니펫, 해당 페이지에 포함합니다.

댓글

  • 일반적인 코드는 h : inputText + h : outputText의 컨트롤 일뿐입니다. 단일 필드. 싸울 가치가 없다고 느낍니다. 게다가이 페이지는 모드와 다른 개발자 (사용자 관점에서 볼 때)에게도 혼란 스럽기 때문에 실제로 작동하지 않기 때문에 죽을 수 있습니다.
  • 문제는 실제로 언제 전환해야 하는가입니다. 수정할 때마다 분할을 재고해야합니다. 페이지가 지저분 해지기 시작하면 분할하십시오. 동료도 자신의 아이디어가 좋다고 생각하지만 아직 구현할 가치가 없다고 생각하면 더 편안 할 것입니다.

답변

코드 중복은 사실상 결코 좋은 일이 아닙니다. 즉, 두 번 이하로 복제되는 소량은 실생활에서 받아 들일 수 있습니다. 종교적인 것보다 실용적인 것이 좋습니다. 귀하의 경우에는 더 많은 양의 코드와 3 개의 장소처럼 들리므로 제 개인적인 임계 값을 약간 초과합니다. 따라서 저는 일반 버전을 선호합니다.어쨌든 지금 작동한다면 이론적 인 이유로 만질 필요가 없습니다.

OTOH 앞으로 페이지간에 더 많은 차이가있을 수 있다고 말할 때 이것은 다음을 의미 할 수 있습니다. 어느 시점에서 분리 된 페이지로 전환하는 것이 더 경제적이됩니다 (가능한 한 공통성을 추출하여 페이지 간의 중복을 최소화하기 위해 노력하면서). 따라서 향후 변경 될 때마다 상황을 재평가하십시오.

답변

JSF처럼 보입니다. 각각의 render = “…”는 본질적으로 코드에 if가 있다는 것을 의미하며, 이는 추가적인 복잡성을 유발합니다.

나는 “여기에서 몇 가지 차이점 만 제외하고 동일한 페이지이기 때문에 동일한 작업을 수행했습니다. 그리고 거기 “라고 간단히 말하면 그렇지 않기 때문에 장기적으로 작동하지 않습니다 . / em> 같은 페이지를 사용하고 제대로 작동하도록하기 위해 점점 더 정교한 트릭을 수행해야 유지 관리가 불필요하게 어려워집니다.

JSP 대신 facelet과 함께 JSF를 사용하는 경우 가능하다면) 페이지 블록에 해당하는 XML 조각을 빌드 할 수 있으며 필요한 곳에 포함 할 수 있습니다. 이렇게하면 모듈화를 구입하고 페이지 전체에서 콘텐츠를 재사용 할 수 있습니다.

동료의 말을 들어보세요. 그가 옳습니다.

댓글

  • 내 편집 내용을 참조하세요
  • @ 0101, 의심스러운 정확히 이것입니다. ‘하지 마십시오. 이것은 광기의 길입니다. nd 확실히 미래의 메인테이너에게.
  • 진짜 문제는 내 방식이 최선의 방식이라는 것입니다. 내가 3 페이지를했다면 누군가가 페이지 중 하나만 변경하고 다른 페이지는 생각하지 않을 수 있습니다. 내 버전을 미래의 유지 관리자로 만들고 싶습니다.
  • 내 코드가 미래의 관리자가 다른 경우에 대해 생각하게 만드는 것 같습니다. 프로젝트의 새로운 프로그래머 였고 디버거에서 baseFormBasic.xhtml의 코드를 변경해야한다는 것을 발견했다면 baseFormAdv 및 baseFormSpec에서도 변경 하시겠습니까?
  • @ 0101, 무엇이 가장 좋은지 물어보십시오. 선입견을 확인하고 싶습니까?

답변

페이지를 생성 할 기회가 있습니까? 코드를 사용하십니까? 이 경우 다음과 같은 방법이 있습니다.

page1 = { showField1 = true; showField2 = false; showField3 = true; } page2 = { showField1 = true; showField2 = false; showField3 = false; } 

그리고 페이지 렌더링 코드

if page.showField1 then .... if page.showField2 then .... 

또는 OOP 스타일 :

class Page1 { renderField1() { ...} renderField2() {} renderField2() { ...} } class Page2 { renderField1() { ...} renderField2() {} renderField2() {} } 

댓글

  • 아니요, 변경 사항이 없습니다. . 내가 그렇게하면 십자가에 못 박힐 것입니다. 게다가 그것은 정확히 같은 문제를 만듭니다. == 렌더링 된 경우
  • 페이지 로직을 추출하므로 정확한 문제는 아닙니다. 두 가지 대신 한 가지 작업 만 수행합니다.
  • 아마도 똑같은 느낌입니다. 제 이유는 필드를 표시하는 것이 다른 한 가지 일 뿐이며 배치도 다르고 때로는 레이블도 있기 때문입니다. 웹 프로그래밍도 포함되어 있으므로 ‘ 이렇게 할 수 없습니다.

Answer

모달 코드는 더 나빠질 수 있습니다 . 처음에 한 번 분류하고 결정하고 모드없이 구현을 정리합니다.

댓글

  • isn ‘ t 코드 중복이 최악입니까? 모든 코드는 항상 서로 동기화되어야합니다 (간단하게 변경하면 사전 변경을 기억하고 잊어 버리면 어떻게 되나요?)
  • 서브 루틴, 함수, 도우미 / 기본 클래스 등에서 공통 코드를 분리합니다. ; OOP에서 모달 코드는 누락 된 클래스를 나타냅니다 …

답변

이 질문의 본질 약간의 차이가있는 매우 유사한 세 개의 웹 페이지가있는 경우이 세 페이지를 복제하고 필요에 따라 각 페이지를 수정하거나 “모드”에 따라 페이지를 동적으로 렌더링하는 논리를 단일 페이지에 빌드하는 것이 좋습니다. “이 (가)보고 있습니다.

기록을 위해 저는 JSF 사람이고 좋아하고 조건부 렌더링을 사용합니다.

3 페이지를 선택하면 변경 사항이 발생함에 따라 유지 관리자가 세 페이지 모두에 올바르게 적용하지 못할 위험이 있습니다.

조건부 렌더링을 사용하기로 선택한 경우 해당 문제를 해결하지만 약간의 생각이 필요할 수있는 일부 비즈니스 로직을 페이지로 옮겼습니다.

개인적으로 조건부 렌더링 사용에 문제가 없지만 모드 로직이 백업 빈으로 이동하는 것을보고 싶습니다. 예 : 대신 :

<h:output rendered="mode=2" value="Name: " />

좋아요 :

<h:output rendered="#{myBean.advancedMode}" value="Name: " />

빈이 로직을 사용하고 true 또는 false를 반환하여 요소의 렌더링을 제어합니다.

그 이유는보고있는 모드가이 한 페이지 이상을 제어해야하거나 사용자의 단일 세션을 넘어서도 유지해야하거나 모드를 완전히 아래로 변경해야 할 수 있기 때문입니다. 도로.

또는 두 가지 접근 방식 중 하나에 잠재적 인 단점이 있으며 모든 단점은 길을 따라 고통을 완화하는 것과 관련이 있다는 것을 인정하고 이러한 “길 아래”상황 중 하나가 발생할 때 더 걱정하는 데 동의 할 수 있습니다. 실제로 요구 사항이 어떻게 변경 될 수 있는지에 대해 더 많이 알고 있으므로 이제 더 나은 결정을 내립니다.

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다