I wonder if there is any kind of design pattern that make my code more concrete.
I guess a Factory Method Pattern can help me but not sure.
Below the code, the Shape creation Method needs other creation methods to create child elements (ex: Extrusion -> Loop -> Vertices). Inside Shape creation method, a programmer should customize created child element to clarify what shape the method will make. Below is just a my situation don't have to get deep into my situation. Anyone can help me, any suggestions will be glad.
thank you.
here is my suedo code flow written in C#. Sorry for the lack of details but better to understand faster.
public class SomethingClass
{
//Some codes...
//create Circle
public void CreateCircle(string SomethingPathName)
{
var element = CreateExtrusion(SomethingPathName);
//some codes goes like below
element.foofoo = bar;
element = CreateLoop(element);
foreach (var foo in bar)
{
element = CreateVertices(element);
}
}
//create Rectangle
public void CreateRectangle(string SomethingPathName)
{
var element = CreateExtrusion(SomethingPathName);
//some codes..
element = CreateLoop(element);
//some codes..
foreach (var foo in bar)
{
element = CreateVertices(element);
}
}
//create something other shape
public void CreatePyramid(string SomethingPathName)
{
var element = CreateExtrusion(SomethingPathName);
//some codes..
element = CreateLoop(element);
//some codes..
foreach (var foo in bar)
{
element = CreateVertices(element);
}
}
// so one...
//Some codes...
}
below is my more specific real codes. I dont want you to get pain from this but if might be needed.
private void CreateFoundation(FoundationType foundationType, FoundationColumnName heightColumnName, DbElement objectiveElement, DataSet dsConverterData, DataTable dtConverterData, DataRow item_height, string extrusionName, string s3d_note, Guid PDMS_GROUP_ID)
{
if (foundationType == FoundationType.FOOTING
|| foundationType == FoundationType.SCREEDTHK
|| foundationType == FoundationType.LEANCONCRETE
|| foundationType == FoundationType.CRUSHEDSTONES)
{
#region Footing, ScreedThk, LeanConcrete, CrushedStones
objectiveElement = this.CreateExtrusion(foundationType
, objectiveElement
, this.StringToDouble(dtConverterData.Rows[0]["ZPOINT"].ToString()) * 1000d
- GetSubBase_Z_HeightForCalculation(item_height, heightColumnName)
, this.StringToDouble(item_height[heightColumnName.ToString()].ToString())
, extrusionName
, PDMS_GROUP_ID
, s3d_note
, dsConverterData.Tables[TableName.CONVERTER_FOUNDATIONS_DATA.ToString()].Rows[0][FoundationColumnName.NOTE_DIM.ToString()].ToString());
//NXTRUSION 생성
this.CreateHole(foundationType, objectiveElement, dsConverterData, extrusionName, PDMS_GROUP_ID, s3d_note);
//create loop
objectiveElement = this.CreateLoop(objectiveElement, Guid.NewGuid().ToString());
//create vertices
foreach (DataRow drConverterData in dtConverterData.Rows)
{
this.CreateVertex(
objectiveElement
, Guid.NewGuid().ToString()
, StringToDouble(drConverterData["XPOINT"].ToString()) * 1000d
, StringToDouble(drConverterData["YPOINT"].ToString()) * 1000d
, this.StringToDouble(drConverterData["ZPOINT"].ToString()) * 1000d
- GetSubBase_Z_HeightForCalculation(item_height, heightColumnName));
}
#endregion
}
else if (foundationType == FoundationType.PEDESTAL)
{
#region PEDESTAL
//Gouping 구분 : PED_ID
var groupBy_PED_ID = dtConverterData.AsEnumerable().GroupBy(row => row["PED_ID"]);
string fdn_name_no = extrusionName;
//목적지 엘리먼트 리셋
DbElement temp_dest_equip = objectiveElement;
foreach (var group_PED_ID in groupBy_PED_ID)
{
string ped_name = dsConverterData.Tables[TableName.CONVERTER_PEDESTAL_DATA.ToString()]
.AsEnumerable()
.Where(row0 => row0["PED_ID"].ToString() == group_PED_ID.AsEnumerable().FirstOrDefault()["PED_ID"].ToString())
.Select(row => row["PED_NAME"].ToString()).FirstOrDefault().ToString();
ped_name = Regex.Replace(ped_name, @"\s+", "");
objectiveElement = this.CreateExtrusion(
foundationType
, objectiveElement
, this.StringToDouble(dtConverterData.Rows[0]["ZPOINT"].ToString()) * 1000d
, this.StringToDouble(group_PED_ID.AsEnumerable().Select(row => row["PEDESTAL_HEIGHT"]).FirstOrDefault().ToString())
, "(Pedestal)" + ped_name
, PDMS_GROUP_ID
, group_PED_ID.AsEnumerable().Select(row => row["S3D_NOTE"]).FirstOrDefault().ToString()
, group_PED_ID.AsEnumerable().Select(row => row["NOTE_DIM"]).FirstOrDefault().ToString());
DbElement temp_pedestal = objectiveElement;
this.CreateHole(foundationType
, objectiveElement
, dsConverterData
, ped_name
, PDMS_GROUP_ID
, group_PED_ID.AsEnumerable().Select(row => row["S3D_NOTE"]).FirstOrDefault().ToString());
objectiveElement = this.CreateLoop(objectiveElement, Guid.NewGuid().ToString());
foreach (DataRow drConverterData in group_PED_ID)
{
this.CreateVertex(objectiveElement, Guid.NewGuid().ToString()
, this.StringToDouble(drConverterData["XPOINT"].ToString()) * 1000d
, this.StringToDouble(drConverterData["YPOINT"].ToString()) * 1000d
, this.StringToDouble(drConverterData["ZPOINT"].ToString()) * 1000d);
}
#region grout
//목적지 엘리먼트 리셋
objectiveElement = temp_dest_equip;
objectiveElement = this.CreateExtrusion(
FoundationType.GROUT
, objectiveElement
, this.StringToDouble(dtConverterData.Rows[0]["ZPOINT"].ToString()) * 1000d
+ this.StringToDouble(group_PED_ID.AsEnumerable().Select(row => row["PEDESTAL_HEIGHT"]).FirstOrDefault().ToString())
, this.StringToDouble(group_PED_ID.AsEnumerable().Select(row => row["GROUT_THK"]).FirstOrDefault().ToString())
, "(Grout)" + ped_name
, PDMS_GROUP_ID
, group_PED_ID.AsEnumerable().Select(row => row["S3D_NOTE"]).FirstOrDefault().ToString());
this.CreateHole(FoundationType.GROUT
, objectiveElement
, dsConverterData
, ped_name
, PDMS_GROUP_ID
, group_PED_ID.AsEnumerable().Select(row => row["S3D_NOTE"]).FirstOrDefault().ToString());
objectiveElement = this.CreateLoop(objectiveElement, Guid.NewGuid().ToString());
foreach (DataRow drConverterData in group_PED_ID)
{
this.CreateVertex(objectiveElement, Guid.NewGuid().ToString()
, this.StringToDouble(drConverterData["GROUT_XPOINT"].ToString()) * 1000d
, this.StringToDouble(drConverterData["GROUT_YPOINT"].ToString()) * 1000d
, this.StringToDouble(drConverterData["GROUT_ZPOINT"].ToString()) * 1000d);
}
//목적지 엘리먼트 리셋
objectiveElement = temp_dest_equip;
#endregion
}
#endregion
}
else if (foundationType == FoundationType.PILE)
{
#region PILE
var groupBy_PILE_ID = dtConverterData.AsEnumerable().GroupBy(row => row["PILE_ID"]);
//목적지 엘리먼트 리셋
DbElement temp_dest_equip = objectiveElement;
foreach (var group_PILE_ID in groupBy_PILE_ID)
{
DataRow drPile = group_PILE_ID.ToList().FirstOrDefault();
string pile_note = $"{s3d_note}◆PI◆{drPile["PILE_SHAPE"]}◆{drPile["PILE_DIAMETER"]}◆{drPile["PILE_PREFIX"]}◆{drPile["PILE_NO"]}";
string pile_noteItem = $"{s3d_note}◆PI◆{drPile["PILE_SHAPE"]}◆{drPile["PILE_DIAMETER"]}◆{drPile["PILE_PREFIX"]}◆{drPile["PILE_ID"]}";
objectiveElement = this.CreateExtrusion(foundationType
, objectiveElement
, this.StringToDouble(dtConverterData.Rows[0]["ZPOINT"].ToString()) * 1000d
, this.StringToDouble(item_height[heightColumnName.ToString()].ToString())
, extrusionName
, PDMS_GROUP_ID
, pile_note
, ""
, pile_noteItem);
objectiveElement = this.CreateLoop(objectiveElement, Guid.NewGuid().ToString());
foreach (DataRow drConverterData in group_PILE_ID)
{
this.CreateVertex(objectiveElement, Guid.NewGuid().ToString()
, this.StringToDouble(drConverterData["XPOINT"].ToString()) * 1000d
, this.StringToDouble(drConverterData["YPOINT"].ToString()) * 1000d
, this.StringToDouble(drConverterData["ZPOINT"].ToString()) * 1000d);
}
//목적지 엘리먼트 리셋
objectiveElement = temp_dest_equip;
}
#endregion
}
else if (foundationType == FoundationType.TIEGIRDER)
{
#region TieGirder
objectiveElement = this.CreateExtrusion(
foundationType
, objectiveElement
, this.StringToDouble(dtConverterData.Rows[0]["ZPOINT"].ToString()) * 1000d
, this.StringToDouble(dtConverterData.Rows[0]["TIEGIRDER_HEIGHT"].ToString())
, extrusionName
, PDMS_GROUP_ID
, s3d_note
, dsConverterData.Tables[TableName.CONVERTER_TIEGIRDER_DATA.ToString()].Rows[0][FoundationColumnName.NOTE_DIM.ToString()].ToString());
objectiveElement = this.CreateLoop(objectiveElement, Guid.NewGuid().ToString());
foreach (DataRow drConverterData in dtConverterData.Rows)
{
this.CreateVertex(objectiveElement, Guid.NewGuid().ToString()
, this.StringToDouble(drConverterData["XPOINT"].ToString()) * 1000d
, this.StringToDouble(drConverterData["YPOINT"].ToString()) * 1000d
, this.StringToDouble(drConverterData["ZPOINT"].ToString()) * 1000d);
}
#endregion
}
}
In your case, factory or abstract factory pattern.
There are the below design pattern for creation of object.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.