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

여기에 μ½”λ“œβ€¦

```

1개의 μ’‹μ•„μš”

@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();
}