C# Method Chain에 대해

안녕하세요. :smile:

저는 최근에 메서드 체인(Method Chaining)을 사용해보고 있는데요.

예전부터 jQuery selector나 Selenium(IWebElement)와 같은 라이브러리를 사용하면서도
이런 구조에 대해 제대로 인식하지 못하고 사용해왔었습니다. (Linq등 많지요.)

그래서 사실 최근에 와서 개념이나 용어에 대해서도 관심이 많습니다.

아래는 제가 실제 사용중인 코드 일부분인데요.
Json을 간단하게 생성하고 보다 유연하게 사용하기 위해 만들었습니다.

public class Json : JObject
{
	public static Json Create => new Json();

	public Json Add(Field field, JToken token)
	{
		string property = "";

		switch (field)
		{
			case Field.SEQ: property = "SEQ"; break;
			case Field.CULTURE_SEQ: property = "CULTURE_SEQ"; break;
			case Field.RES_KEY: property = "RES_KEY"; break;
			case Field.RES_DATA: property = "RES_DATA"; break;
			case Field.INFO: property = "INFO"; break;
			case Field.ADDRESS: property = "ADDRESS"; break;
		}
		Add(property, token);
		return this;
	}
}

모든 곳에서 사용하려는 것은 아니지만,

Json data = Json.Create.Add(Field.SEQ, 0)
    .Add(Field.RES_KEY, "JAMES")
    .Add(Field.INFO, "elena")
    .Add(Field.ADDRESS, "Seoul");

제 생각에는 위와 같은 코드가 보기에(모양이) 좋아보이는데요.
(원래 이름을 SetField로 했다가 Add로 바꿨어요.)

제가 구현한 부분에 대해 부족한 부분이나 네이밍, 구조 등 다양한 의견과 조언을 듣고싶습니다.

읽어주셔서 감사합니다. :smile:

좋아요 2

저는
JObject json = new JObject()
{
{ “key”: “value” },
{ “key2”: “value2” }
};
이렇게 초기화합니다. 컬렉션은 이게 편해서… 굳이 메소드체인을 걸어서 아이템을 넣지 않아도 되지 않을까 싶습니다. 두 번째 스니펫에서 Add 메소드 뒤에 세미콜론이 붙는 건 오타죠?

댓글은 코드 스니펫같은 게 안 되나보네요. 들여쓰기도 안 되고…

좋아요 2

원하는 코드의 결과가 나온다면, 어떤 코드 스타일, 형식을 취하는지는 자유 일것 같습니다.

조금 더 코드를 보완하고자 한다면 다음과 같겠군요.

  • 새로운 인스턴스를 생성하는 것은 속성보다는 메소드가 의미적으로 적절할 것 같습니다. ‘Create()’, 어떠한 변경 없이 속성을 읽는 것 만으로 새로운 인스턴스가 생성되는 것은 일반적이지 않는것 같습니다.

  • 메소드 체이닝에 의해 사용해야 하는 인스턴스의 상태가 계속 변하는 것은 위험합니다. 체이닝을 통해 'Setting’을 하고 최종 'Build’해서 사용하는게 좋습니다.

예시) JsonBuilder로 메소드 체이닝 구현. 최종 Build 반환값으로 Json 반환 및 사용

좋아요 5

그리고 한가지 더 말씀 드리자면, 네이밍에 대한 것인데, 네이밍은 목적에 부합하게 디자인 하는게 좋지 않을까요? 가령, 코드의 결과는 적절한 필드와 그 필드에 값을 할당하여, JSON Object를 만드는것인데, 이게 최종 사용되는 곳이 있을텐데, 가령, 요청의 파라미터로 쓰인다던지요. 만약 그렇다면 다음과 같이 네이밍을 하는게 어떨까요?

  • RequestParamBuilder
  • RequestParam

이런 형태가 되면 JsonObject 상속은 불필요해 보이고요.

좋아요 2

@김청호 앗 오타 얼른 지웠습니다. 감사합니다. :smile:
맞습니다. 저도 말씀하신 것 처럼 주로 사용하고 있습니다.

여담으로 아래와 같은 좋은 점도 있었습니다.

수십 명 개발자가 작업할 때 통일된 필드 제약을 사용함으로써 필드 사용에 대한 문제를 줄일 수 있고 Json 관련 확장을 유연하게 이어나갈 수 있었습니다.

그리고

댓글에서도 코드블록에서 직접 작성하시면 됩니다!

```csharp

여기에 코드…

```

@dimohy Create()로 바꿨습니다. :smile:

그리고 Setting 말씀하신건 상속이 아닌 위임을 뜻하시는건가요?

조언해주신대로 한번 바꿔봤습니다!

public class JsonBuilder
{
	private JObject Json = new JObject();
	public static JsonBuilder Create() => new JsonBuilder();

	public JsonBuilder Setting(Field field, JToken token)
	{
		string property = "";
		switch (field)
		{
			case Field.SEQ: property = "SEQ"; break;
			case Field.CULTURE_SEQ: property = "CULTURE_SEQ"; break;
			case Field.RES_KEY: property = "RES_KEY"; break;
			case Field.RES_DATA: property = "RES_DATA"; break;
			case Field.INFO: property = "INFO"; break;
			case Field.ADDRESS: property = "ADDRESS"; break;
		}
		Json.Add(property, token);
		return this;
	}
	public JObject Build() => Json;
    public ToJsonString() => Json.ToString();
}