나는 곤경에 처해 있습니다. 함수 내에서 데이터베이스를 많이 변경하는 저장소에서 작업하고 있습니다.

내가 다루는 함수는 응답 ID를 반환합니다 (하지만 데이터베이스 작업이 아닌 변환에서). 그러나 부작용으로 이러한 responseId가 포함 된 객체를 데이터베이스에 추가합니다.

그래서 이름을 지정해야합니다.

  • getResponseIds : 반환 값을 강조합니다. 매우 기능적인 사고 방식이지만 postToDB 함수가있는 경우 getStatusOfPost
  • 를 사용하는 것은 의미가 없습니다.

  • addResponseIdToDB : 내 많은 함수가 데이터베이스에서만 작동하고 아무 것도 반환하지 않는 경향이 있다고 생각하지만 이것은 부작용을 강조합니다.
  • getAndAddResponseIdsToDB : 매우 유익하지만 매우 깁니다.

위 제안에 대한 장단점은 무엇입니까? 아니면 더 나은 제안을 할 수 있습니까?

댓글

  • persistResponseIds는 어떻습니까?
  • getStatusOfPost 🙂
  • getAndSaveResponseIds
  • responseIds = createResponseIds()는 명확하고 간결 해 보입니다. 이전에는 존재하지 않았던 get() ‘이므로 create가 적절한 동사입니다. 새로 생성 된 항목은 ‘ create() 함수가 반환 될 것으로 기대하는 것입니다. 아니면 ‘ 명백한 것이 누락 되었나요?
  • @fattie 코드가 자체 주석 처리되어야한다는 데 동의합니다. 주석은 코드가하는 일을 알려주지 않아야합니다. 주석은 코드가 존재하는 이유를 알려야합니다. 코드를 리팩토링하는 것이 코드를 리팩토링하는 것을 의미한다면 ‘ 댓글이 잘못된 것입니다. 나는 이름이 긴 완전한 문장이 될 수 있다는 데 동의합니다. 좋은 이름은 당신을 놀라게하는 것으로부터 함수 내부를 계속 살펴 봐야합니다. ‘ 구현 방법을 알려 주면 안됩니다. 클라이언트가 무엇을 기대하고 있는지 알려줄 것입니다. 그렇게하면 좋은 추상화가됩니다.

답변

and 잘못된 추상화 수준 에 있습니다.

addResponseIdToDB()쪽에 의지합니다. 그렇지 않으면 부작용이 완전히 놀랍기 때문입니다. 그러나 :

responseIds = addResponseIdToDB(); 

아무도 놀라게하지 않습니다.

명령 쿼리 책임 분리 원칙 은 이것이 responseId 개체를 얻는 유일한 방법이 아니어야한다고 주장합니다. 이 개체를 얻을 수있는 DB를 변경하지 않는 쿼리도 있어야합니다.

Bertrand Meyer 와는 달리 이것은 add가 void를 반환해야한다는 것을 의미하지 않습니다. 단지 동등한 순수 쿼리가 존재해야 함을 의미합니다. 상태 변경 쿼리를 사용하여 DB가 불필요하게 남용되지 않도록 쉽게 찾을 수 있습니다.

getResponseIds()가 존재하고 데이터베이스와 통신하지 않아야한다는 점을 감안할 때 두 가지를 모두 수행하는 메서드의 가장 좋은 이름은 실제로 . 그러나 그것은 당신이 그것에 대한 모든 기능적 구성을 얻고 싶을 때입니다.

댓글

  • 말한 내용에 추가, 그러나 사용되지 않은 단어를 ‘ 추가하면 ” 및 “는 함수가 원자 적 인 작업을 수행 할 때 적합합니다. 원자 적으로 / 함께 / 한 번에 두 가지 일이 발생하여 얻을 수있는 이점이 있다면이 두 가지가 함수에 무엇인지 명시 적으로 표시합니다. 이름이 좋습니다. 따라서 귀하의 첫 번째 진술에 일반적으로 동의하지만 자격이 없으면 동의하지 않습니다.
  • … 아무도 떠나지 않습니다. 놀랐습니다. “. 동의하지 않습니다. ‘ 부울 변수가 그런 다음 모든 기능이 추가되고 하나로 합쳐진다는 사실을 깨닫기 위해 정신적 변화를해야합니다.하지만 getAndAddResponseIdsToDB @tintintong에 동의하지 않습니다. 너무 길어; ‘는 많은 내 함수 이름 길이의 절반 정도입니다. 함수가 두 가지 작업을 수행하는 경우 이름에 그렇게 말하십시오.
  • @Luaan 좋습니다. getAndIncrement의 이름을 그때로 변경 하시겠습니까? otherIncrement?
  • @Luaan 그러면 Increment가 반환하는 값은 사전 증가 또는 사후 증가입니까? ‘ 문서를 살펴 보지 않으면 어떤 것이 될지 명확하지 않습니다.incrementAndGetgetAndIncrement 훨씬 더 나은 메서드 이름이라고 생각합니다.

    및 ” 메서드 이름에, 적어도 반환 값에 영향을 줄 수있는 부작용이있는 메서드의 특정 경우 ..

  • @Luaan ” 증가는 증가 된 값을 반환합니다 “는 사전 증가 값을 의미합니까? 처음에 오해 했군요 .. 실제로 getAndIncrementincrementAndGetincrement, 개별적으로 고려하더라도

답변

다른 사람들이 언급했듯이 함수 이름에 and를 사용하면 함수가 적어도 두 가지 작업을 수행하고 있음을 자동으로 암시합니다. 이는 일반적으로 “너무 많이 수행하거나 무언가를 수행하고 있음을 나타냅니다.” 잘못된 위치에 있습니다.

함수 이름에 and 절을 사용하는 것은 내 경험상 특정 흐름에 다음과 같은 단계가있을 때 의미가 있습니다. 순서대로 수행해야하거나 전체 계산이 의미가있을 때 수행해야합니다.

숫자 계산에서 이것은 많은 의미가 있습니다.

normalizeAndInvert(Matrix m)

내 말은, 누가 알겠습니까? 계산이 필요한 경우 컴퓨터 그래픽과 인증서에서 조명 궤적을 단계에서는 특정 행렬을 정규화하고 반전해야하며 다음과 같이 지속적으로 작성해야합니다.

m = normalize(m) 다음에 invert(m)는 정규화 및 반전의 추상화를 소개하는 간단한 예와 마찬가지로 가독성 관점에서 유용 할 수 있습니다.

의미 적으로 말하자면 divideAndConquer() 등은 명시 적으로 작성하지 않는 것이 좋지만 기본적으로 And가 필요합니다.

댓글

  • 함수는 정기적으로 두 가지 이상의 일을 수행하지만 이러한 기능은 사소한 일을 더하여 하나의 큰 일을 더해야합니다. ‘는 더 높은 수준에서 의미가 있습니다. normalizeAndInvertcomputeLighting 일 수 있고 divideAndConquerapplyMachiavelli
  • 분명히 🙂 이름에 ” 및 “가 포함 된 함수를 먼저 생성한다고 말하면됩니다. 특정 컨텍스트에 기반한 자연스러운 추상화로 올 수 있습니다. ” Rename 메서드 “를 통한 리팩토링은;) 바로 뒤에 와야합니다.
  • @BrunoOliveira 가끔 두 단계가 그 자체가 많은 요소의 구성 요소이므로 이름 바꾸기는 올바른 접근 방식이 아닙니다. ‘ 드 물어야하지만 절대 사용하지 않으면 ‘ 자신을 반복한다는 의미입니다.

답변

일반적으로 괜찮다고 말할 수 있지만 “모든 경우에 허용되는 것은 아닙니다.

예를 들어 and 단일 책임 원칙 (SOLID의 S)을 기반으로하는 함수 이름의 div>-and는 여러 책임. and가 실제로 함수가 두 가지 일을한다는 것을 의미한다면 무슨 일이 일어나고 있는지 신중하게 생각하고 싶을 것입니다.

함수 이름에 and를 사용합니다. Java의 동시성 및 여기에서 찾을 수 있습니다. and는 실제로 무슨 일이 일어나고 있는지에 대해 매우 중요한 부분이며, 상태가 변경되고 상태가 반환되는 게시물에서 설명하는 내용과 거의 일치합니다. 따라서 분명히 일부 사람들이 있습니다 ( 및 일부 사용 사례).

댓글

  • and는 여러 책임을 의미 할 수 있습니다 “. 그리고이 경우 그것은 실제로 그것을 나타냅니다. 이 함수는 어딘가에서 응답 ID를 가져 와서 데이터베이스에 쓰고 반환합니다. ” 및 “에 대한 필요성은 실제로 적어도 두 가지 기능이 필요하다는 OP로 아이디어를 제기해야합니다. 하나는 ID를 가져 오는 것입니다. 그리고 하나는 데이터베이스에 쓸 수 있습니다.
  • and가 코드 냄새라는 데 동의하지만 기본 동작은 합법적입니다. 일반적으로 나쁘지 않습니다. 주요 기능을 수행하는 데 필요한 (중간) 결과가되는 메서드에서 추가 값을 반환하는 아이디어. 이 메서드의 주요 기능이 응답 ID를 데이터베이스에 추가하는 것이라면 호출자에게 추가 된 ID를 추가로 반환하는 것은 메서드의 깔끔하고 간편한 사용 기능 일뿐입니다.
  • ‘ 이것이 반드시 SRP를 위반한다고 생각하지 않습니다. 항상 여러 작업을 수행하는 함수가 필요합니다. 중요한 부분은 이러한 함수가 필요한 코드를 직접 포함하는 대신 원하는 모든 작업에 대해 다른 함수를 호출하도록하는 것입니다.
  • 함수가 두 가지 작업을 수행하면 이름이이를 반영해야합니다.

답변

사실이 질문은 수많은 댓글이 증명할 수 있으므로 대답하기 어려운 질문입니다. 사람들은 모순 된 의견과 조언을 가지고있는 것 같습니다. 좋은 이름입니다.

이미 제안 된 것에 더 많은 색상을 추가 할 수 있다고 생각하기 때문에 2 개월 된 스레드에 2 센트를 추가하고 싶습니다.

이름 지정은 하나의 프로세스입니다.

이 모든 것이 훌륭한 6 단계 가이드 인 프로세스로서의 이름 지정 을 생각 나게합니다.

불량한 함수 이름은 “놀랍고 신뢰할 수없는 이름”입니다. 좋은 이름을 지정하는 것은 첫 번째 샷에서 제대로하기 어렵습니다. 경험이 있으면 더 쉬워집니다.

좋은 이름을 만들기위한 6 가지 반복 단계

  1. 놀라운 이름을 명백한 넌센스로 대체 (예 : appleSauce()). 어리석게 들리지만 “일시적이며 이름을”신뢰할 수 없음 “을 분명히합니다.
  2. 정직한 이름을 사용하세요. , 함수가 수행하는 작업에서 이해 한 내용을 기반으로합니다. DB 부분의 삽입을 아직 이해하지 못했다고 가정하면 getResponseIdsAndProbablyUseDb가 옵션이 될 것입니다.
  3. Get 솔직히 말해서 , 함수 이름은 함수가하는 모든 것을 말합니다 (getAndAddResponseIdsToDB 또는 getResponsesButAlsoAddCacheOfTheResponsesToTheDb @Fattie의 좋은 예입니다.)
  4. 기본적으로 “올바른 일을합니다” “AND”를 따라 함수를 분할하는 부분입니다. 따라서 실제로는 getResponseIdsaddResponseIdsToDb가 있습니다.
  5. 의도 표시이름 으로 “항상 응답 ID를 받고 싶습니다. 이렇게하면 DB에 삽입됩니다. “. 구현 세부 사항에 대해 생각하지 말고 가장 작은 함수 2 개를 사용하여 다른 것을 만드는 추상화를 만듭니다. 이것은 @candied_orange에서 언급 한 더 높은 추상화 수준입니다. xample createResponseIds가이를 수행 할 수 있으며 getResponseIdsaddResponseIdsToDb의 구성이 될 것입니다.

li>

  • 도메인 추상화로 이동 . 이것은 당신의 사업에 달려 있습니다. 비즈니스 언어를 제대로 들으려면 시간이 걸립니다. 결국 Response의 개념으로 끝날 수 있으며 Response.createIds()이 의미가있을 것입니다. 아니면 ResponseId가 귀중한 것이고 많은 것을 만들 공장이있을 것입니다. DB에 삽입하는 것은 Repository 등의 구현 세부 사항이 될 것입니다. 예, 디자인은 더 추상적 일 것입니다. 더 풍부하고 더 많이 표현할 수 있습니다. 팀 외부의 누구도 귀하의 상황에서 올바른 도메인 추상화가 무엇인지 말할 수 없습니다. 상황에 따라 다릅니다 .
  • 귀하의 경우에는 이미 1과 2를 알아 냈으므로 적어도 3으로 이동해야합니다 ( “AND”사용). 하지만 더 나아가는 것은 단순히 이름을 지정하는 문제가 아니라 실제로 책임을 분할하는 것입니다.

    따라서 여기에서 다른 제안이 유효합니다

    본질적으로 :

    • 예, 놀라운 함수 이름은 끔찍하며 아무도 처리하고 싶지 않습니다.
    • 예, “AND”는 오해의 소지가있는 이름보다 낫기 때문에 함수 이름에 허용됩니다. / li>
    • 예, 추상화 수준은 관련 개념이며 중요합니다.

    즉시 6 단계로 갈 필요는 없습니다. 그대로 유지하는 것이 좋습니다. 2 단계, 3 단계 또는 4 단계를 더 잘 알 때까지!


    모순 된 조언처럼 보이는 것에 대해 다른 관점을 제공하는 데 도움이되기를 바랍니다. 모든 사람이 동일한 목표를 목표로한다고 생각합니다 ( 놀랍지 않은 이름) 그러나 자신의 경험에 따라 다른 단계에서 중지하십시오.

    질문이 있으면 기꺼이 대답하십시오. 🙂

    답변

    함수는 다음 두 가지 작업을 수행합니다.

    1. ID 집합을 가져옵니다. 변환을 통해 호출자에게 반환합니다.
    2. 해당 ID 세트를 데이터베이스에 기록합니다.

    여기서 단일 책임 원칙을 기억하십시오. 함수를 목표로해야합니다. 두 가지가 아니라 하나의 책임을 져야합니다. 두 가지 책임이 있으므로 두 가지 기능이 있습니다.

    getResponseIds-변환을 통해 ID 집합을 가져 와서 호출자에게 반환
    addResponseIdToDB-ID 세트를 가져 와서 데이터베이스에 씁니다.

    여러 책임이있는 단일 함수를 호출하는 것에 대한 전체 문제가 사라지고 함수 이름에 and를 입력하려는 유혹도 사라집니다.

    p>

    추가 보너스로, 동일한 함수가 더 이상 관련되지 않은 두 작업에 대해 책임을지지 않기 때문에 getResponseIds를 저장소 코드에서 이동할 수 있습니다. DB 관련 활동을 수행하지 않기 때문에 별도의 비즈니스 수준 클래스 / 모듈 등으로.

    댓글

    • 그 ‘는 확실하지만이 두 가지 SRP 방법을 사용하여 스 니펫을 여러 번 반복하는 것을 발견하면이 작업을 수행하는 간단한 방법을 작성하여 DRY를해야합니다. ‘ 아니요?
    • @maaartinus, 여러 곳에서이 두 가지 메서드를 호출하는 경우 코드의 응집력 부족 문제가있을 수 있습니다. ” DRY ” 함수를 생성하면 이러한 응집력 부족이 가려집니다.

    답변

    복합 함수 이름을 사용할 수 있으므로 사용하는 명명 체계는 컨텍스트에 따라 다릅니다. 당신에게 그것을 해체하라고 말하는 순수 주의자들이 있지만, 나는 그렇지 않다고 주장 할 것입니다.

    이러한 것들을 피하려는 두 가지 이유가 있습니다.

    • 순도-함수 두 가지를 수행하는 것은 각각 한 가지를 수행하는 두 개의 함수로 변환되어야합니다.
    • 언어 적 크기-bigUglyCompositeFunctionName는 읽기 어렵습니다.

    순도 논쟁은 일반적으로 초점을 맞추는 것입니다. 모호한 일반적인 휴리스틱으로서 함수를 분리하는 것은 좋은 일입니다. 진행중인 작업을 구분하여 이해하기 쉽게합니다. 두 행동을 결합시키는 변수를 공유하여 “영리한”트릭을 할 가능성이 적습니다.

    그러므로 스스로에게 물어볼 것은 “어쨌든해야합니까?”입니다. 나는 일을 깨뜨리는 것은 모호한 휴리스틱이라고 말하고, 그래서 당신은 그것에 반대하기 위해서는 정말 괜찮은 논쟁이 필요합니다.

    한 가지 주요 이유는 두 작업을 하나로 생각하는 것이 유익하기 때문입니다. 이에 대한 궁극적 인 예는 원자 연산에서 찾을 수 있습니다 : compare_and_set. compare_and_set는 원 자학 (잠금없이 멀티 스레딩을 수행하는 방법)의 기본 초석으로 많은 사람들이 이라고 생각할만큼 충분히 성공적입니다. 기초. 그 이름에는 “and”가 있습니다. 이에 대한 아주 좋은 이유가 있습니다. 이 작업의 요점은 비교와 설정을 하나의 불가분의 작업으로 수행한다는 것입니다. compare()set()로 분리하면 함수가 처음에 존재하는 이유 전체를 무력화 할 수 있습니다. div id = “464bc5fa4e”>

    set()이전에 연속적으로 발생할 수 있습니다.

    또한 성능면에서도 볼 수 있습니다. 제가 가장 좋아하는 예는 다음과 같습니다. fastInvSqrt . 이것은 1 / sqrt (x)를 계산하는 Quake의 유명한 알고리즘입니다. “inverse”와 “square root”연산을 결합하면 그들은 한 단계로 두 연산을 모두 수행하는 Newton의 근사를 수행합니다 (그리고 시대에 중요한 부동 소수점 대신 정수 수학에서 수행합니다). inverse(sqrt(x))를 수행하면 훨씬 느려질 것입니다!

    결과가 더 명확한 경우가 있습니다. 교착 상태와 같은 것에 대해 엄청나게주의해야하는 스레딩과 관련된 여러 API를 작성했습니다. 사용자가 내부 구현 세부 정보를 알지 못하도록했기 때문에 (특히 변경할 수 있기 때문에) API를 작성했습니다. 사용자가 둘 이상의 함수 호출을 위해 잠금을 유지하지 못하도록하는 몇 가지 “and”함수. 즉, 내부에서 다중 스레드 동기화를 처리하는 방법을 알 필요가 없었습니다. 사실, 대부분의 사용자는 “멀티 스레드 환경에 있다는 사실조차 인식하지 못했습니다!

    일반 규칙은 일을 나누는 것이지만 항상 함께 연결해야하는 이유가있을 수 있습니다. , “gets”없이 데이터베이스에 여러 번 추가하여 아키텍처를 깨뜨릴 수 있습니까? DB에 로그인 된 각 응답에 고유 한 식별자가 필요한 경우 사용자가 원하는대로 수행하면 문제가 발생할 수 있습니다. 마찬가지로, 사용자가 결과를 DB에 기록하지 않고 “get”하게하고 싶습니까? 대답이 “yes”이면 사용자가 “get”기능에 액세스 할 수 있도록 분리합니다. 사용자가 결과가 DB에 기록되지 않고 “얻을”수 있다면 응용 프로그램의 보안이 손상됩니다. 실제로 함수를 함께 유지해야합니다.

    이제 어휘 문제에 관해서는 함수 이름이 무엇을 설명해야합니다. 사용자는 그것에 대해 알아야합니다. “get”부분부터 시작하겠습니다.모든 예제가 할당 된 int id = addResponseIdToDB() “를 표시하므로 함수 이름에서”get “을 제거하기가 매우 쉽습니다. 함수가 사용되는 모든 위치에서 종료됩니다. 함수가 값을 반환했다는 사실을 문서화합니다.

    마찬가지로 “add”는 선택 사항 일 수 있습니다. “부작용”이라는 용어를 모두 포함하는 용어로 사용하지만 그에 다른 음영이 있습니다. DB 항목이 단순한 로그인 경우 강조 표시 할 이유가 없습니다. playMusicAndSendPersonalInformationToOurCorporateServers와 같은 함수는 볼 수 없습니다. 단지 playMusic 일 뿐이며 운이 좋다면 문서에서 인터넷을 통한 소켓 연결에 대해 언급 할 수 있습니다. 반면에 사용자가 DB에 물건을 추가 할 목적으로이 함수를 호출 할 것으로 예상되는 경우에는 “추가”가 필수적입니다. 그것을 꺼내지 마십시오.

    이제 저는 여러분이 요청하는 모든 가능한 조합을 수행해야하는 많은 이유를 작성했습니다. 나는 선택이 있기 때문에 의도적으로 질문에 대답하지 않았습니다. 따라야 할 규칙이 아닙니다. 당신은 API를 만들고 있습니다.

    그렇지만 제 직감은 addResponseIdToDB가 가장 좋은 답이 될 것입니다. 대부분의 경우 “get”부분은 모든 곳에 입력하여 발생하는 추가 소음이 발생하지 않을 정도로 명백한 부작용입니다. 그러나 “중요하다고 생각할 수있는 몇 군데가 있습니다.

    • “가져 오기”가 비싸다면-인터넷을 통해 무언가를 가져 와서 로컬 캐시 DB에 추가하는 “가져 오기”를 수행해야한다면 “가져 오기”가 중요합니다. 사용자가하려는 일입니다.
    • 사용자가 가치에주의를 기울여야 필요 하다는 것을 분명히해야하는 경우. 사용자가 변수를 사용하려면 “API가 변수를 반환한다는 사실을 깨닫고이를 사용합니다.” 그러나 “필요한지 모르는 사용자”를 경계하고 싶을 것입니다. 예를 들어 나중에 메모리를 확보하기 위해 ID로이 작업을 “닫아야”하는 경우에는주의를 끌 수 있습니다. “뭔가를하고 있습니다. 이 경우 “get”이 아닌 다른 동사를 볼 수 있습니다. “get”은 종종 멱등 함수를 의미합니다 (다시 호출해도 아무 일도하지 않음). 리소스를 반환하는 경우 “create”또는 “acquire”와 같은 다른 동사가 좋습니다.이 특정 실패 메커니즘은 예외 처리를 수행 할 때 C에서 주요 문제입니다. . C는 C ++의 catch / throw 메커니즘이 없기 때문에 반환 코드에 의존합니다. 개발자는 단순히 이러한 반환 코드를 확인하지 않고 버퍼 오버플로와 같은 매우 나쁜 상황에 빠진 것으로 유명 합니다.
    • 대칭-어휘 대칭을 갖도록 API를 설계하는 경우가 있습니다. 단어가 쌍 또는 다른 패턴으로 나오도록 설정하고 시각적으로 쉽게 식별 할 수 있도록 명령을 작성합니다. 패턴을 따랐는지 여부. 나는 이것이 드문 일이라고 말하고 싶지만 전례가없는 것은 아닙니다. XML 태그를 닫는 이유가 태그 이름 (예 : < foo > 및 < / foo >).

    댓글

    • div id = “6a2f57beef”> 수학을 모릅니다 : 1 / x와 sqrt (x)는 다소 느린 함수입니다. 몇 가지 영리한 수학을 사용하면 1 / sqrt (x)를 빠르게 계산할 수 있습니다. i> 나눗셈이나 제곱근보다 훨씬 빠릅니다. 실제로 sqrt (x)를 계산하는 가장 빠른 방법은 영리한 구현으로 1 / sqrt (x)를 계산하고 결과에 x를 곱하는 것입니다.
    • 물리학 에서처럼 기본 단위는 더 이상 미터와 초가 아니라 초와 빛의 속도입니다. 미터 길이보다 더 정확하게 빛의 속도를 측정 할 수 있기 때문입니다.

    답변

    궁극은 무엇입니까 이 메소드의 의도 od? 이러한 변환 된 ID를 DB에 추가하는 이유는 캐싱 목적입니까? 저는 그 가정하에 작업하겠습니다.

    메소드의 의도는 실제로 변환 된 응답 ID를 가져 오는 것 (변환을 수행하거나 캐시에서 가져 오기)하는 것 같습니다. 메서드 이름 :

    getTransformedResponseIds 이하 getResponseIds()

    이 이름의 메소드는 캐시 할 수 있습니다. 문서화 할 수는 있지만 메소드 이름이 “특정 구현에 연결되어서는 안됩니다. DB 사용을 중지하고 임시 메모리에 캐시하는 대신 다른 곳에 캐시하기로 결정한 경우 어떻게해야합니까?

    부작용은 그저 부작용이어야하며 문서화되어야하지만 핵심 의도 (또는 성공) 또는 기능 이름에 실제로 영향을주지 않아야합니다. 중요한 문제가 아니어야하는 캐시에서 값을 가져 오지 못한 경우 (또는 캐시를 건너 뛰도록 구성한 경우) 메서드는 투명하게 다시 계산하고 캐시 (또는 안 함) 한 다음 새 값을 반환해야합니다.

    때때로 “AND”를 사용하면 Java 메소드 getAndIncrementincrementAndGet와 같은 의도를 전달하는 데 도움이됩니다. 그것은 확실히 표에서 벗어난 것이 아닙니다.

    Answer

    당신은이 함수가 any db action “.

    이는 함수가 getter보다 생성자처럼 작동 함을 나타냅니다. 그러나 생성자도 부작용을 일으키지 않아야합니다 (링크 주셔서 감사합니다. @ MechMK1 ).

    반면에 팩토리 메서드는 이미 어느 정도의 혼란을 전제로합니다. . 예를 들어, 팩토리 메서드를 사용하는 동기 중 하나는 팩토리 메서드입니다.

    여러 생성자가 존재하는 경우 더 읽기 쉬운 코드를 허용합니다. 다른 이유. -wikipedia

    마찬가지로

    부작용에 대한 작업을 수행해야하는 경우 해당 부작용이 무엇인지보다 명확하게하는 방식으로 팩토리 메소드의 이름을 지정할 수 있습니다. -ruakh

    프로그래머에게 데이터베이스 저장소에 대해 알리기 위해 “logged”라는 용어를 사용하여 함수를 팩토리 메소드로 만드는 것을 고려하십시오.

    • 선언 : createLoggedResponseid(...) {...} // log object to db
    • 전화 : responseid = createLoggedResponseid(...);

    댓글

    답글 남기기

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