ํฐ์คํ ๋ฆฌ ๋ทฐ
ํจ์๋ฅผ cleanํ๊ฒ ๋ง๋๋ ๋ฐฉ๋ฒ
1. ์๊ฒ๋ง๋ค๊ธฐ
2. ๋ธ๋ก๊ณผ ๋ค์ฌ์ฐ๊ธฐ
3. ํ๊ฐ์ง ๊ธฐ๋ฅ๋ง
4. ์์ ์ ์ธ ๋ค์ด๋ฐ
5. ํจ์ ์ธ์
6. ๋ถ์ํจ๊ณผx
7. ๋ช ๋ น์กฐํ
8. ์ค๋ฅ์์ธ
9. ๊ตฌ์กฐ์ ํ๋ก๊ทธ๋๋ฐ
์ฐ์ bad ํจ์ ์์
๋๊ฒน์ผ๋ก ์ค์ฒฉ๋ if๋ฌธ์ผ๋ก
๋ช ํํ์ง ์์ ํ๋๊ทธ, ๋ฌธ์์ด,ํจ์ ํธ์ถ์ ํ๊ณ ์์.
-> ํจ์๊ฐ ๋๋ฌด ๊ธธ๊ณ , ์ด๋ค ์ผ์ ํ๋์ง ์๊ธฐ ํ๋ฆ.
1. ์๊ฒ ๋ง๋ค๊ธฐ
ํ ํจ์์ ๊ธธ์ด๋ 20์ค๋ ๊ธธ๋ค๊ณ ํ๋ค.
2. ๋ธ๋ก๊ณผ ๋ค์ฌ์ฐ๊ธฐ๋ ํ์ค์ด์ด์ผ ํ๋ค.
if, else, while ๋ฌธ์ ๋ค์ด๊ฐ๋ ์ฝ๋๋ ํ์ค์ด์ด์ผํ๊ณ ๋๊ฐ ํจ์๋ฅผ ํธ์ถํด์ผํ๋ค.
func rednerPageWithSetupAndTeardowns(pageData: PageData, isSuite: Bool) -> String {
if (isTestPage(pageData)) {
inlcudeSetupAndTeardownPages(pageData, isSuite)
}
return pageData.getHtml()
}
3. ํ๊ฐ์ง ํจ์์ ํ๊ฐ์ง ๊ธฐ๋ฅ๋ง.
ํจ์๋น ์ถ์ํ ์์ค๋ ํ๊ฐ์ง๋ก, ํจ์๋ด ๋ชจ๋ ์ถ์ํ ์์ค์ด ๋์ผํด์ผํ๋ค.
getHtml() - ์ถ์ํ ์์ค ๋์ํธ
.append("\n") - ์ถ์ํ ์์ค ๋ฎ์ ํธ
๊ตฌํํ๋ค๋ณด๋ฉด ํ ํจ์์ ๊ฐ์ ์ถ์ํ ์์ค๋ง์ ๊ฐ์ง๊ธด ์ฝ์ง ์์๋ฐ,
'ํ ๊ฐ์ง'๋ง ํ๋ ํจ์๋ก ๊ตฌํํ๋ฉด ์ฝ๊ฒ ๊ตฌํ ๊ฐ๋ฅํ๋ค.
switch๋ฌธ์ ์ฌ์ฉํ๊ฒ๋ ๊ฒฝ์ฐ 'ํ ๊ฐ์ง'๋ง ํ๋ ํจ์๋ฅผ ๊ตฌํํ๊ธฐ ์ด๋ ค์. (N๊ฐ์ง ์ผ์ ์ฒ๋ฆฌ)
public Money calculatePay(Employee e) throws InvalidEmployeeType {
switch (e.type) {
case COMMISIONED :
return calculateCommissionedPay(e);
case HOURLY :
return calculateHourlyPay(e);
case SALARIED :
return calculateSalariedPay(e);
default :
throw new InvalidEmployeeType(e.type);
}
}
- ์ ์ง์์ ์ ํ (case)๊ฐ ์ถ๊ฐ ๋ ๊ฒฝ์ฐ ๋ ๊ธธ์ด์ง๋ค.
- e.type ์ ๋ฐ๋ผ ๊ธฐ๋ฅ์ด ๋ฌ๋ผ์ ธ์ ํ ๊ฐ์ง ๊ธฐ๋ฅ๋ง์ ํ์ง ์์. SRP ์์น (ํ๋์ ๊ฐ์ฒด๋ ํ๋์ ์ฑ ์๋ง) ์๋ฐ
- OCP ์์น(ํ์ฅ open, ์์ close) ์๋ฐ - ์ ์ง์ ์ ํ์ ์ถ๊ฐํ ๋ ๋ง๋ค ์ฝ๋๋ฅผ ๋ณ๊ฒฝํด์ผํจ.
- ์ ๊ตฌ์กฐ์ ๋์ผํ ํจ์๊ฐ ๋ฌดํ์ ์กด์ฌํจ.
isPayday(Employee e, Date date);
deliverPay(Employee e, Money pay);
ํด๊ฒฐ๋ฐฉ์
- Employee์ ์ธํฐํ์ด์ค Abstract Factory๋ฅผ ๋ง๋ค์ด switch๋ฌธ์ ์จ๊น.
- ์ป์ ์ ์๋ ํจ๊ณผ: ์ 4๋ฅผ ํด๊ฒฐํ๊ณ 1,2,3์ ์ต์ํ ํ ์ ์์.
// ์ถ์ ํด๋์ค Employee
public abstract class Employee {
public abstract boolean isPayday();
public abstract boolean calculatePay();
public abstract boolean deliverPay(Money pay);
}
// Employee๋ฅผ ์์ ๋ฐ๋ ๊ฐ์ฒด๋ค์ ์์ฑํ ์ ์๋ EmployeeFactory ์ธํฐํ์ด์ค
public interface EmployeeFactory {
public Employee makeEmployee(EmployeeRecord r) throws InvalidEmployeeType;
}
// EmployeeFactory๋ฅผ ๊ตฌํํ ํด๋์ค
public class EmployeeFactoryImpl implements EmployeeFactory {
public Employee makeEmployee(EmployeeRecord r) throws InvalidEmployeeType {
switch (r.type) {
case COMMISIONED :
return new CommissionedEmployee(r);
case HOURLY :
return new HourlyEmployee(r);
case SALARIED :
return new SalariedEmployee(r);
default :
throw new InvalidEmployeeType(r.type);
}
}
}
์ด๋ ๊ฒ switch๋ฌธ์ employee์ impl๋ก ๋ฐ๋ก ๊ตฌํํด์ฃผ๊ฒ๋๋ค๋ฉด
ํ์ employee ๊ฐ์ฒด์์ switch๋ฌธ์ ์ฌ๋ฌ๋ฒ ์ฌ์ฉํ์ง ์๊ฒ ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋ค.
Abstract Factory ๋ ๊ฐ์ฒด ์์ฑ์ ๋ํ ์ถ์ํ๋ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ๋ ๋์์ธ ํจํด
๊ฐ์ฒด ์์ฑ์ ๋ด๋นํ๋ ์ฝ๋๋ฅผ ์ถ์ํํ์ฌ ๊ฐ์ฒด ์์ฑ ๊ณผ์ ์ ๋ณํ์ ์ ์ฐํ๊ฒ ๋์ฒํ ์ ์๋ค.
์ถ์ ํฉํ ๋ฆฌ ํจํด์ ์ผ๋ฐ์ ์ผ๋ก ๋น์ทํ ๊ธฐ๋ฅ์ ๊ฐ์ง ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๊ฒฝ์ฐ ์ฌ์ฉ๋๋ค.
Abstract Factory ์์
๋ง์ฝ ์ฌ๋ฌ ์ข ๋ฅ์ GUI ์ปดํฌ๋ํธ(๋ฒํผ, ํ ์คํธ ์์ ๋ฑ)๋ฅผ ๋ง๋ค์ด์ผ ํ๋ค๋ฉด,
์ถ์ ํฉํ ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ๊ฐ์ GUI ์ปดํฌ๋ํธ์ ์์ฑ์ ์ถ์ํํ์ฌ ์ ์ฐํ ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋ค.
// button, textfield๋ฅผ ์์ฑํ๋ Abstract Factory Protocol
protocol GUIFactory {
func createButton() -> Button
func createTextField() -> TextField
}
// button, textfield๊ฐ ๊ฐ์ ธ์ผ ํ ์์ฑ๊ณผ ๋ฉ์๋๋ฅผ ์ ์ Abstract Product Protocol
protocol Widget {
var backgroundColor: UIColor { get set }
func display()
}
๋ฒํผ๊ณผ ํ ์คํธํ๋์ ์์ฑ์ ์ถ์ํ ํ์์ผ๋ฉฐ,
// iOS์ฉ ๊ตฌ์ฒด์ ์ธ ํฉํ ๋ฆฌ ํด๋์ค
class IOSFactory: GUIFactory {
func createButton() -> Button {
return IOSButton()
}
func createTextField() -> TextField {
return IOSTextField()
}
}
// iOS์ฉ ๊ตฌ์ฒด์ ์ธ ๋ฒํผ ํด๋์ค
class IOSButton: UIButton, Widget {
var backgroundColor: UIColor = .white
func display() {
// ๋ฒํผ์ ํ๋ฉด์ ๋ณด์ฌ์ฃผ๋ ์ฝ๋
}
}
// iOS์ฉ ๊ตฌ์ฒด์ ์ธ ํ
์คํธ ํ๋ ํด๋์ค
class IOSTextField: UITextField, Widget {
var backgroundColor: UIColor = .white
func display() {
// ํ
์คํธ ํ๋๋ฅผ ํ๋ฉด์ ๋ณด์ฌ์ฃผ๋ ์ฝ๋
}
}
์ด๋ฐ์์ผ๋ก ์ ํ๋กํ ์ฝ์ ๊ตฌํํ๋ ๊ตฌ์ฒด์ ์ธ ํฉํ ๋ฆฌ์ ํ๋ก๋ํธ class๋ฅผ ๊ตฌํํด์ค ๋ค,
// ํด๋ผ์ด์ธํธ ์ฝ๋
let factory: GUIFactory = IOSFactory()
let button = factory.createButton()
button.backgroundColor = .blue
button.display()
let textField = factory.createTextField()
textField.backgroundColor = .gray
textField.display()
ํด๋ผ์ด์ธํธ์์๋ IOSFactory๋ฅผ ์์ฑํ๊ณ ,
createButton(), createTextField() ๋ฉ์๋๋ก Button, TextField ์์ฑ.
๊ณตํต๋ ์์ฑ backgroundColor์ display() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ํ๋ฉด์ ์ถ๋ ฅํด์ค
4. ์์ ์ ์ธ ์ด๋ฆ ์ฌ์ฉ
์ ์๋ ํจ์ ์ด๋ฆ์ tesatableHtml -> SetupTeardownIncluder.render๋ก ๋ณ๊ฒฝํด์ค
๊ธธ๊ณ ์์ ์ ์ธ ์ด๋ฆ์ด ์งง๊ณ ํจ์ถ์ ์ธ ์ด๋ฆ๋ณด๋ค ์ข์.
-> ํจ์๋ช ๋ง ์ฝ๊ณ ํจ์ ๊ธฐ๋ฅ์ ํ์ ํ ์ ์๊ฒ ํด์ค(ํ๊ฐ์ง ๊ธฐ๋ฅ ์ ์ํํ๋ค๋ฉด)
5. ํจ์ ์ธ์
5.1 ํจ์ ์ธ์์ ๊ฐ์๋ 3๊ฐ ์ดํ๋ก ํด์ผํจ.
ํจ์ ์ธ์๋ ์ ์์๋ก ์ข๋ค.
includeSetupPageInto(newPageContent) ๋ณด๋ค includeSetupPage()๊ฐ ์ดํดํ๊ธฐ ์ฌ์
private void inlcudeSetupAndTeardownPages() throws Exception {
includeSetupPages();
includePageContent();
includeTeardownPages();
updatePageContent();
}
์ ์๋ ํจ์ ์ธ์ 4๊ฐ๋ถํฐ๋ ํน๋ณํ ์ด์ ๊ฐ ์์ด๋ ์ฌ์ฉํ์ง ๋ง๋ผ๊ณ ํจ.
5.2 ํ๋๊ทธ ์ธ์๋ ์ง์ํด์ผํ๋ค.
ํจ์๋ก ๋ถ์ธ๊ฐ์ ๋๊ธฐ๋ ๊ด๋ก๋ ๋์ฐํ๋ค๊ณ ๋งํ๊ณ ์์.
func rednerPageWithSetupAndTeardowns(pageData: PageData, isSuite: Bool) -> String {
if (isTestPage(pageData)) {
inlcudeSetupAndTeardownPages(pageData, isSuite)
}
return pageData.getHtml()
}
isSuite๋ก Bool ๊ฐ์ ๋ฃ์ด์ฃผ๋ ๋์
rederForSuite()์ renderForSingleTest()๋ผ๋ ํจ์๋ก ๋๋ ์ ์ฌ์ฉํ๋ผ๊ณ ํจ.
5.3 ๋์ฌ์ ํค์๋
write(name) ๋์ ๋์ฌ์ ๋ช ์ฌ๋ฅผ ์์ผ๋ก ์ฌ์ฉํ์ฌ
wirteField(name) ์ด๋ ๊ฒ ์์ฑํ๋ฉด ์ข ๋ ์๊ธฐ ์ฝ๋ค.
ํจ์ ์ด๋ฆ์ ํค์๋๋ฅผ ์ถ๊ฐํด์ฃผ๋ฉด ์ธ์ ์์๋ฅผ ๊ธฐ์ตํ์ง ์์๋ ๋๋ค๊ณ ํจ.
assertExpected() ๋์ assertExpectedEqualsActual(expected, actual)
6. ๋ถ์ ํจ๊ณผ ์ผ์ผํค๊ธฐx
userName๊ณผ password๋ฅผ ์ ๋ ฅ๋ฐ์ true of false๋ฅผ return ํ๋
์ํธ ํ์ธํ๋ ํจ์์ Session.initialize() ํธ์ถ ํ ๊ฒฝ์ฐ
์ฌ์ฉ์๋ฅผ ์ธ์ฆํ๋ฉด์ ๊ธฐ์กด ์ธ์ ์ ๋ณด๋ฅผ ์ง์๋ฒ๋ฆฌ๋ ์ํฉ์ด ์๊ธธ ์ ๋ ์๋ค.
7. ๋ช ๋ น๊ณผ ์กฐํ ๋ถ๋ฆฌ
์์ฑ๊ฐ์ ์ฐพ์ value๋ก ์ค์ ํ๊ณ ์ฑ๊ณตํ๋ฉด true๋ฅผ ๋ฐํํ๋ ํจ์๋ก
public boolean set(String attribute, String value); ๊ฐ ์์ ๋
if (set("username", "unclebob")).. ์ด๋ฐ์์ผ๋ก๋ ์ฌ์ฉ ๋ ์ ์๋ค.
1. username์ด unclebob์ผ๋ก ์ค์ ๋์ด ์๋ ๊ฒฝ์ฐ์ธ์ง
2. username์ด๋ผ๋ ์์ฑ๊ฐ์ unclebob๊ฐ์ ์ฑ๊ณต์ ์ผ๋ก ๋ฃ์์ ๊ฒฝ์ฐ์ธ์ง
if ๋ฌธ์ฅ๋ง ๋ด์๋ ์ง๊ด์ ์ผ๋ก ์๊ธฐ ์ด๋ ต๋ค.
if (attributeExist("username")) {
setAttribute("username", "unclebob");
}
์ด๋ฐ์์ผ๋ก ๋ช ๋ น๊ณผ ์กฐํ๋ฅผ ๋ถ๋ฆฌํด์ ์์ฑํ๋ฉด ์ข์.
8.์ค๋ฅ ์ฝ๋๋ณด๋ค๋ ์์ธ๋ฅผ ์ฌ์ฉ
์ค๋ฅ์ฝ๋๋ฅผ ๋ฐํํ๋ ํํ๋ ์ 7๋ฒ์ ๋ช ๋ น์กฐํ ๋ถ๋ฆฌ ๊ท์น์ ์ด๊ธ๋จ.
if (deletePage(page) == E_OK) {
if (registry.deleteRefrence(page.name) == E_OK) {
~~
}
}
์ด๋ ๊ฒ ์์ฑํ๊ธฐ ๋ณด๋ค๋
try {
deletePage(page);
registry.deleteReference(page.name);
} catch {
}
์ด๋ฐ์์ผ๋ก Try/Catch๋ก ์ถ์ถํด์ ์ฌ์ฉํ๋ฉด ์ข์
public enum Error {
OK,
INVAILD,
NO_SUCH,
LOCKED
}
์ด๋ฐ์์ผ๋ก error enum์ ์ฌ์ฉํ ๊ฒฝ์ฐ
์์ ์ฌํญ์ด ์๊ธฐ๋ฉด Error ํด๋์ค ์ ๋ถ ๋ค์ ์ปดํ์ผํ๊ณ ๋ฐฐ์นํด์ผํจ.
์ค๋ฅ enum ๋์ ์์ธ๋ฅผ ์ฌ์ฉํ๋ฉด ์ข์
์ ์์ธ๋ Exception ํด๋์ค์์ ํ์๋จ
9. ๊ตฌ์กฐ์ ํ๋ก๊ทธ๋๋ฐ
return์ ํ๋์ฌ์ผํ๋ฉฐ ๋ฃจํ์์์ break, continue ์ฌ์ฉx
goto ๊ธ์ง
์ฌ๊ธฐ๊น์ง๊ฐ clean code ์ 3์ฅ
ํจ์๋ฅผ ์ ๋ง๋๋ ๊ธฐ๊ต
์์ต๋๋ค.
- Total
- Today
- Yesterday
- focus timer ์ดํ
- swift queryitem encode
- swift filemanager excel
- rag ๊ธฐ๋ฐ llm
- rag llm pdf
- swift urlsession module
- swift ์์ ์ฝ๊ธฐ
- swift network module
- swift network ๊ณตํตํ
- rag ๊ธฐ๋ฐ llm ์ฑ๋ด
- swift ์์ ๊ฐ์ ธ์ค๊ธฐ
- ๋ ๋์ธ์ด
- swift urlsession refactoring
- ์๋์ํํธ ๋ ์ด์ธ์ด
- swift urlcomponent encode
- swift urlsession network module
- swift ์๊ฐ
- llm csv
- llm pdf rag
- swift urlsession ๊ณตํตํ
- readysay
- swift network refactoring
- swift excel read
- swift ๋คํธ์ํฌ ๋ชจ๋ํ
- ๊ณต๋ถ ํ์ด๋จธ ์ดํ
- swift filemanager get excel
- ๋ ๋์ธ์ด ์ดํ
- swift get excel
- chatgpt rag llm
- filemanager excel read
์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |