다음과 같은 코드가 많은 코드베이스를 상속했습니다.
SomeDataAdapter sda = new SomeDataAdapter();
sda.UpdateData(DataTable updateData);
그리고 sda는 다시는 사용되지 않습니다.
해당 메소드가 실제로 정적 클래스 메소드 여야 함을 나타내는 코드 냄새입니까?
다음과 같은 코드가 많은 코드베이스를 상속했습니다.
SomeDataAdapter sda = new SomeDataAdapter();
sda.UpdateData(DataTable updateData);
그리고 sda는 다시는 사용되지 않습니다.
해당 메소드가 실제로 정적 클래스 메소드 여야 함을 나타내는 코드 냄새입니까?
답변:
UpdateData가 아마도 'service'클래스에 속해야한다는 아키텍처 냄새라고 생각합니다.
데이터가 Apple 인 경우 AppleAdapter가 서비스 / 비즈니스 인텔리전스 클래스 인 경우 여기서 AppleService는 현재 메소드 외부에 존재하는 AppleAdapter에 대한 싱글 톤 참조입니다.
private static volatile AppleAdapter _appleService = null;
private static object _appleServiceLock = new object();
private AppleAdapter AppleService
{
get
{
if (_appleService == null)
{
lock (_appleServiceLock)
{
if (_appleService == null)
_appleService = new AppleAdapter();
}
}
return _appleService;
}
}
public SomeAppleRelatedMethod(Apple apple)
{
AppleService.UpdateData(apple);
}
나는 당신이하는 일이 반드시 틀렸다고 생각하지 않지만 SomeDataAdapter가 실제로 어떤 종류의 무국적 비즈니스 서비스를 대표한다면, 싱글 톤이 최선의 방법 일 것입니다. 희망이 도움이됩니다! 제공된 예제는 _appleService가 null이거나 두 개 이상의 스레드에 의해 정확히 동시에 액세스 된 경우 _appleService의 경합을 방지하는 멋진 방법입니다.
그거 알아? SomeDataAdapter가 ADO IDbDataAdapter (거의 확실 함)이면이 전체 응답을 무시하십시오!
:피
원래 질문에 의견을 추가 할 권한이 없지만이 코드가있는 위치를 지정할 수있는 경우
이 코드가 IDbDataAdapter의 사용자 정의 구현을 나타내고 UpdateData가 IDbConnection, IDbCommand를 작성하고 모든 것을 배후에 연결하는 경우 스트림 및 기타에 대해 이야기하고 있기 때문에 코드 냄새가 나지 않을 것입니다 사용이 끝나면 폐기해야 할 것들.
나는이 문제가 그것보다 더 깊어 진다고 생각한다. 정적 메소드로 리팩토링하더라도 단일 정적 메소드를 호출하는 코드를 어디서나 얻을 수 있습니다. 내 의견으로는 코드 냄새 자체입니다. 중요한 추상화가 누락되었음을 나타낼 수 있습니다. 아마도 사전 및 사후 처리를 수행하면서 사이에 일어나는 일을 변경할 수있는 코드를 만들고 싶을 수도 있습니다. 사전 및 사후 처리에는 공통 호출이 포함되며 그 사이에는 구체적인 구현에 따라 달라집니다.
거의. 일반적으로 함수를 전달하고 원하는 언어를 사용하지 못하게됩니다. 어색하고 우아하지 않지만 일류 기능이없는 언어에 갇혀 있다면 할 수있는 일이 많지 않습니다.
해당 객체 중 어느 것도 다른 함수에 대한 인수로 전달되지 않으면 정적 메소드로 바꿀 수 있으며 아무것도 변경되지 않습니다.
fn x => x + 1
과 new Function<Integer, Integer>() { public Integer eval(Integer x) { return x + 1; }};
또는 몇 하드 코딩 좁게-유용한 기능에 자신을 제한.
fn x => x + 1
구문 설탕이 될 수 없었 new Function<Integer, Integer>() { public Integer eval(Integer x) { return x + 1; }}
습니까? 아마도 이런 종류의 구문 설탕이없는 언어에 갇혀 있다면 의미 할 것입니다.
"자주"를 정의하십시오. 얼마나 자주 객체를 인스턴스화합니까? 많이-아마 아닐까요?
시스템에 더 큰 문제가있을 수 있습니다. 정적 상태가되면 객체의 내부 상태가 변하지 않는다는 것을 프로그래머에게보다 명확하게 전달할 수 있습니다.
상태가 엉망이고 첫 번째를 정적으로 만들기 위해 다른 것을 정적으로 시작 해야하는 경우 어떤 부분을 정적으로 해야하는지와 어떤 부분이 정하지 않아야하는지 묻어 야합니다.
예 , 코드 냄새, 작은 냄새입니다.
여기서 냄새는 객체에 (최소한) 랩핑 된 절차 코드라는 것입니다.
데이터 테이블에서 해당 작업을 수행 해야하는 이유 가 있어야 하지만 일부 의미를 공유하는 다른 관련 작업 (예 : 공통의 의미가있는)으로 해당 작업을 모델링하는 대신 작성자는 새로운 프로 시저 내에서 새 프로 시저를 분리했습니다. 클래스 & 전화.
기능적 언어에서, 당신이 일하는 방식입니다;) 그러나 OO 패러다임에서, 당신 은 그 연산을 포함한 추상화 를 모델링 하고 싶을 것 입니다. 그런 다음 OO 기술을 사용하여 해당 모델을 제거하고 일부 의미를 유지하는 일련의 관련 작업을 제공합니다.
여기서 주요 냄새는 저자가 클래스를 사용하고 있다는 것입니다. 아마도 컴파일러가 개념 모델로 작업을 구성하지 않고도 클래스가 필요하기 때문입니다.
BTW 는 문제 공간 대신 프로그램 이 모델링되는 것을 볼 때마다주의하십시오 . 디자인이 더 많은 생각으로부터 이익을 얻을 수 있다는 신호입니다. 다시 말해, 클래스가 모두 "xAdaptor"및 "xHandler"및 "xUtility"이며 일반적으로 빈혈 도메인 모델 과 연결되어있는 클래스를 살펴보십시오 . 실제로 구현하려는 개념을 모델링하는 것과는 달리 누군가 편의를 위해 코드를 묶는 것을 의미합니다.