C# Rookiss Part4 ๊ฒ์์๋ฒ : PacketGenerator2
๐โโ๏ธPacketGenerator2
- PacketGenerator1์ ํ๋
- PDL(PacketDefinitionList) ์์ฑ
- XmlReader๋ฅผ ํตํด PDL์ ํ์ฑ
- packet๊ณผ packet์ memeber๋ค์ ์์ฐจ์ ์ผ๋ก ํ์ฑ
- ์๋ํ ํด์ ๋ง๋ค๊ธฐ ์ํ์ฌ PacketFormat class ์์ฑ
- public static string์ผ๋ก ์ฌ๋ฌ ๋ฌธ์์ด(@โโ;)์ Session์ Read, Write ๋ฑ ํด๋์ค ๋ณต์ฌ
- ๊ณ ์ ์ ์ธ ๋ถ๋ถ์ ๊ทธ๋๋ก ๊ฐ๋ณ์ ์ธ ๋ถ๋ถ์ {0} {1} โฆ๋ก ์นํ
- PacketGenerator2์์ ํ ๊ฒ๋ค
- genPakcets๋ผ๋ string์ ๋ง๋ค์ด์ ์ด ํจ์ณ์ง gemPackets.csํ์ผ์ ๋ด์ฉ์ ๋ด์ ๊ฒ
- PacketFormat์์ ๋ง๋ {0} {1} .. ์ ์ฑ์์ฃผ๊ธฐ ์ํด ๋ณ์๋ฅผ ๋ง๋ค์ด์ ๋ฐ์ด๋ฃ์ด์ฃผ๊ณ ํฉ์ฒด
- List๋ถ๋ถ๋ ๋ง๋ค์ด์ค์ memberListFormat, readListFormat, writeListFormat ๋ง๋ค์ด ์ฃผ๊ธฐ
๐ช์ฐจ๊ทผ์ฐจ๊ทผ
- PacketGenerator Program
File.WriteAllText("GenPackets.cs",genPackets);
๋ก ํ๋์ ํ์ผ๋ก ๋ง๋ค์ด ์ค- ์ฒซ ์ธ์๋ ํ์ผ ์ด๋ฆ, ๋ค์ ์ธ์๋ ์๋์์ฑ ํ ๊ฒ๋ค์ ๋ฃ์ด์ค
static string genPackets;
- ์๋์์ฑํ๊ฒ์ ์ฌ๊ธฐ์ ๋ฐ์ด ๋ฃ์ด ์ค๊ฑฐ์- ParsePacket์ ํ๋ ๋์์ genPackets์ ๋ฃ์ ๊ฒ์ ์์ฑํด์ผ ๋จ
- ParsePacket์ ParseMembers๊ฐ ๋๋๋ฉด
genPackets += string.Format(PacketFormat.packetFormat, "", "", "", "")
๋ก ๋ด์ฉ์ ๋ฐ์ด ๋ฃ์- ์ด๋ โโ ์ ๊ฐ๋ณ์ธ์๋ก {0} {1} ๋ก ๋ฐ๊พผ ๋ถ๋ถ๋ค
- ๊ฐ๊ฐ ํจํท ์ด๋ฆ, ๋ฉค๋ฒ ๋ณ์๋ค, ๋ฉค๋ฒ ๋ณ์ Read, ๋ฉค๋ฒ ๋ณ์ Write ์ด๊ณ ํจํท์ด๋ฆ์ packetName์ผ๋ก ๋์๋จ
- ๋๋จธ์ง๋ ParseMember๋ฅผ void์์ Tuple<string, string, string>์ผ๋ก ๋ฐ๊พธ์ด ๋ฐํํ๋๋ก ๋ง๋ค ํ ๋์ - ๋ค ๋ฉค๋ฒ ๋ณ์๋ค์ด๋๊น
- Tuple<string, string, string> t = ParseMemebers(r);๋ก ParsePacket์์ ๋ฐ๊ณ ๋ฉค๋ฒ ๋ณ์๋ค, ๋ฉค๋ฒ ๋ณ์ Read, ๋ฉค๋ฒ ๋ณ์ Write๋ฅผ ๊ฐ๊ฐ t.Item1, t.Item2, t.Item3๋ก ๋์
genPackets += string.Format(PacketFormat.packetFormat, packetName, t.Item1, t.Item2, t.Item3)
๋ก ๋ณํ ๋จ
- ParseMember
string memberCode = ""; string readCode = ""; string writeCode = "";
๋ฅผ ๋ฃ์ด์ฃผ๊ณ while(r.Read())๋ฅผ ๋๋ฉดTuple<string, string, string>
์ ๋ฐท์ด์ฃผ๊ฒ ๋ง๋ฆ- r.Read()๋ฅผ ํ๋ค๋ ๊ฒ์ PDL์ ํ์คํ์ค์ฉ ๊ธ์ด์ค๋ ๊ฒ์ด๋ฏ๋ก
if(string.IsNullOrEmpty(memberCode) == false) memberCode += Environment.NewLine;
์ผ๋ก Enter๋ฅผ ์ณ์ค if(string.IsNullOrEmpty(readCode) == false) readCode += Environment.NewLine;
if(string.IsNullOrEmpty(writeCode) == false) writeCode += Environment.NewLine;
๋ ์ถ๊ฐ
string memberType = r.Name.ToLower();
switch (memberType)
{
case "byte":
case "sbyte":
memberCode += string.Format(PacketFormat.memberFormat, memberType, memberName);
readCode += string.Format(PacketFormat.readByteFormat, memberName, memberType);
writeCode += string.Format(PacketFormat.writeByteFormat, memberName, memberType);
break;
case "bool":
case "short":
case "ushort":
case "int":
case "long":
case "float":
case "double":
memberCode += string.Format(PacketFormat.memberFormat, memberType, memberName);
readCode += string.Format(PacketFormat.readFormat, memberName, ToMemberType(memberType), memberType);
writeCode += string.Format(PacketFormat.writeFormat, memberName, memberType);
break;
case "string":
memberCode += string.Format(PacketFormat.memberFormat, memberType, memberName);
readCode += string.Format(PacketFormat.readStringFormat, memberName);
writeCode += string.Format(PacketFormat.writeStringFormat, memberName);
break;
case "list":
Tuple<string, string, string> t = ParseList(r);
memberCode += t.Item1;
readCode += t.Item2;
writeCode += t.Item3;
break;
default:
break;
}
PDL์ ํ์คํ์ค ํ์ฑํ๋ฉด์ ๊ธ์ํ memberCode, readCode, writeCode๋ฅผ ๋ง๋ถ์ฌ์ ์์ฑ์ ํํ Tuple๋ก ์ ๋ฌํด ์ฃผ๋ ๋ถ๋ถ
memberCode = memberCode.Replace("\n", "\n\t");
readCode = readCode.Replace("\n", "\n\t\t");
writeCode = writeCode.Replace("\n", "\n\t\t");
์ ๋ ฌ์ ๋ง์ถฐ์ฃผ๋ ๊ฒ์ผ๋ก memberCode.Replace("\n", "\n\t");
์ ์ํฐ๊ฐ ์๋ ์ ๋ค์ ์ํฐํ ํญ์ ๋๋ฌ์ฃผ์ธ์๋ผ๋ ๋ป
๊ทธํ List๋ ๊ฐ์ ์์ ..
๐ช๋ถ์ ๋ฐ ์๋ํ์ ํ๊ธฐ
์ผ๋จ PDL.xml์ ๋ง๋ค์๊ณ PacketGenerator์ Program์์ XmlReader๋ฅผ ํตํด PDL์ ํ์ฑ
Program์์ ParsePacket๊ณผ ParseMembers๋ฅผ ํตํด genPackets์ ๋ด์ฉ๋ฌผ์ ์์ฑ ํ File.WriteAllText(โGenPackets.csโ, genPackets);๋ก ํ์ผ ์์ฑ
xml์ ์๋ณธ ๋ฐ์ดํฐ์ ๋๋ต์ ์ธ ๊ตฌ์กฐ๋ฅผ ์๊ฒํด์ฃผ๋ ๊ฒ
๊ตฌ์กฐ๋ฅผ ์์์ผ๋ xml์ ํ์ฑ์ํด์ ์๋ณธ ๋ฐ์ดํฐ๋ฅผ ์๋ ์์ฑํ๋ ํด์ ๋ง๋ค๋ฉด ๋๋ค!! xml ํ์ฑ์ XmlReader์ Read()๋ก ํ์ฑ์ ํ๋ ๊ฒ์ด๊ณ ํ์ฑ์ ๋ด์ฉ์ r.Name๊ณผ r[โnameโ]์ด ์๋ค ๊ฐ๊ฐ ํ์ ๊ณผ name์ ๋ค์ด๊ฐ ๊ฐ์ด ๋์จ๋ค
xml์ ํ์ฑํ๋๋ฐ packet ๋ถ๋ถ๊ณผ member๋ถ๋ถ์ผ๋ก ๋๋๋ค
- ์ฌ๋ฌ๊ฐ์ง ํจํท์ด ์์ผ๋ฏ๋ก ํํจํท๋น class๋ก ๋ง๋ค๊ธฐ ์ํจ์ด๋ผ ์๊ฐ๋๋ค (class๊ฐ ์๋๋๋ผ๊ณ ๊ตฌ๋ถํด์ฃผ๋ ์ญํ ์ด๋ผ๊ณ ์๊ฐํ๋ฉด ๋ ๊ฑฐ๊ฐ๋ค)
๊ทธ๋ ๋ค๋ ๊ฒ์ parsePacket์ ๋ค์ด์ค๋ฉด ๊ทธ ํจํท์์ members๋ฅผ ํ์ฑ์ ํด์ผ ๋๋ค๋ ๊ฒ!
ParseMemebers๋ก r.Depth + 1์ธ ๋ถ๋ถ๋ค๋ง ํ์ฑ์ํ์ฌ Packet๋ด์ ๋ฉค๋ฒ๋ค๋ง ํ์ฑ์ ํ๊ฒ ํ๋ค
๋ฉค๋ฒ๋ค์ r[โnameโ]๊ณผ r.Name์ ํ์ฑ์ํ๊ณ ํ์ ์ ๋ฐ๋ผ ์๋ํ ๋๋ ๋ถ๋ถ์ ๋ง๋ค์ด ์ฃผ๋ฉด ๋๋ค
- ํ์ ์ด๋ผํ๋ฉด xml์ ํตํด ์์์๋ ์๋ณธ ๋ฐ์ดํฐ์ ํ์ด๋ค
- ๊ทธ ํ์์ ์๋ํ ๋๋ ๋ถ๋ถ์ ์ง์ด ๋ฃ์ผ๋ฉด ์๋ณธ๊ณผ ๊ฐ์์ง๋ ๊ฒ์ด๋ค
๊ฐ ํ์ ์ผ์ด์ค๋ง๋ค ๊ฐ์ ๋ฃ์ด์ค์ผ ํ๋๋ฐ ์ด๋ PacketFormat์ ์ฌ์ฉํ๋ ๊ฒ์ด๋ค PacketFormat ํ์ผ์ ๋ง๋ค์ด์ ์๋ํํ ๋ด์ฉ์ ๋ฐ๊ฟ์น๊ธฐ ํ๋ ๊ฒ!!
๊ฐ๊ฐ์ ํ์ ์ ๋ง๊ฒ ๋ด์ฉ์ด ๋ฐ๋๋ ๊ทธ๊ฑฐ์ ๋ง์ถฐ์ memberCode, readCode, writeCode๋ฅผ ๋ง๋ค์ด ๋ฐ์ด ๋ฃ์ด์ค๋ค
๋ชจ๋ ์ผ์ด์ค๋ฅผ ๋๊ณ ๋์ ์์ฑ๋ ํฐ~~~ ๋ฌธ์์ด์ WriteAllText๋ฅผ ํตํด csํ์ผ๋ก ๋ง๋ ๋ค
์๋ํ ๋.