[WIP] 중학교 3학년 때 코드를 고2로 팩스
개시하다
이 글은 Life is Tech!Members Advent Calendar 2020의 셋째 날의 글입니다!3일째는 내가 책임진다!!
평소에는 iOS Swift, React, ReactNative를 쓴다.
첫날,이튿날의 보도 품질이 높아 전전긍긍합니다. 열심히 하겠습니다!
그나저나 별말씀을요. 이 부가 달력을 순서대로 시작했어요. 남은 테두리는 13일 정도인데 이렇게 하면 흥분해서 총 14편의 글을 쓸 수 있어요. 그래서 LiT!시간이 된다면 Member가 계속 참석했으면 좋겠어요(웃음)👀👀)
이번에는 제목과 같이 제가 중학교 3학년 때 했던 것컬러 투수 응용 프로그램입니다. 저는 고등학교 2학년 학생이 되어 조금 성장했습니다. 지금 이 시점에서 다시 팩스로 댓글을 달아보도록 하겠습니다.하지만, 프로그램 라이브러리를 가져왔다고 해서 원래의 설치를 대폭 파괴하지 말아야 한다고 생각합니다!다만,'1부터 이 앱을 설치하면 이렇게 설치해야 한다'는 생각이 들어서 거기도 마지막으로!!또 스위프트를 전제로 하기 때문에 많은 댓글이 스위프트나 스위프트와 유사한 언어를 전제로 하지만 전체 프로그래밍 언어에 대한 명칭 등도 관련돼 있으니 관심 있으면 읽어주세요!!
여전히 훌륭한 엔지니어니까 따뜻한 눈빛으로 지켜줬으면 좋겠어요☀️☀️☀️☀️
어떤 앱을 만드는지
글의 첫머리에서 말한 바와 같이 이번에 제작된 앱은 컬러 등산차 앱이다.
레드, 그린, 블루 라이트 3원색의 슬라이더를 움직이면 각각의 비율에 따라 해당 색상과 보색, 반전 색상을 표시하는 앱이다.
중 3 시 코드
이번 팩스에서 3살 때 코드예요. 정말 슬프네요...나무랄 데가 많다.중학교 3학년이면 참을 수 있을까요?
다만, 섬세한 오류 처리가 잘 되어 있어서 나는 그곳이 매우 불편하다고 생각한다
MainViewController.swift
//
// ViewController.swift
// ColorCode
//
// Created by Ren Matsushita on 2019/01/25.
// Copyright © 2019 Ren Matsushita. All rights reserved.
//
import UIKit
class ViewController: UIViewController, UITextFieldDelegate {
var redSlider = UISlider()
var greenSlider = UISlider()
var blueSlider = UISlider()
var redValue: Int = 255
var greenValue: Int = 255
var blueValue: Int = 255
var textfield = UITextField()
var colorLabel = UILabel()
var reverseColorLabel = UILabel()
var comColorLabel = UILabel()
let pasteboard: UIPasteboard = UIPasteboard.general
let screenHeight = UIScreen.main.bounds.height
let screenWidth = UIScreen.main.bounds.width
override func viewDidLoad() {
super.viewDidLoad()
createView()
}
@objc func moveReverseColor() {
guard let reverseColorHex = reverseColorLabel.text else { return }
makeColor(reverseColorHex)
}
@objc func moveComColor() {
guard let comColorHex = comColorLabel.text else { return }
makeColor(comColorHex)
}
@objc func copyColor() {
pasteboard.string = colorLabel.text
let alert = UIAlertController(title: "Done", message: "背景色をコピーしました!!", preferredStyle: .alert)
alert.addAction(
UIAlertAction(title: "OK",
style: .default,
handler: { action in })
)
present(alert, animated: true, completion: nil)
}
@objc func copyComColor() {
pasteboard.string = reverseColorLabel.text
let alert = UIAlertController(title: "Done", message: "反転色をコピーしました!!", preferredStyle: .alert)
alert.addAction(
UIAlertAction(title: "OK",
style: .default,
handler: { action in })
)
present(alert, animated: true, completion: nil)
}
@objc func copyReverseColor() {
pasteboard.string = comColorLabel.text
let alert = UIAlertController(title: "Done", message: "補色をコピーしました!!", preferredStyle: .alert)
alert.addAction(
UIAlertAction(title: "OK",
style: .default,
handler: { action in })
)
present(alert, animated: true, completion: nil)
}
@objc func redSliderChanged(_ sender: UISlider) {
redValue = Int(sender.value)
toHex()
}
@objc func greenSliderChanged(_ sender: UISlider) {
greenValue = Int(sender.value)
toHex()
}
@objc func blueSliderChanged(_ sender: UISlider) {
blueValue = Int(sender.value)
toHex()
}
func toHex() {
let color = UIColor.rgba(red: redValue, green: greenValue, blue: blueValue, alpha: 1)
let invertedColor = UIColor.rgba(red: (255-redValue), green: (255-greenValue), blue: (255-blueValue), alpha: 1)
self.view.backgroundColor = color
colorLabel.textColor = color
let wh = UIColor.white
let bl = UIColor.black
if redValue + greenValue + blueValue <= 382 {
textfield.textColor = wh
colorLabel.textColor = wh
reverseColorLabel.textColor = bl
comColorLabel.textColor = wh
textfield.layer.borderColor = wh.cgColor
} else if redValue + greenValue + blueValue >= 382 {
textfield.textColor = bl
colorLabel.textColor = bl
reverseColorLabel.textColor = wh
comColorLabel.textColor = bl
textfield.layer.borderColor = bl.cgColor
}
let com = max(redValue, greenValue, blueValue) + min(redValue, greenValue, blueValue)
reverseColorLabel.backgroundColor = invertedColor
comColorLabel.backgroundColor = UIColor.rgba(red: (com - redValue), green: (com - greenValue), blue: (com - blueValue), alpha: 1)
colorLabel.text = hexValue(red: redValue, green: greenValue, blue: blueValue)
textfield.text! = hexValue(red: redValue, green: greenValue, blue: blueValue)
reverseColorLabel.text = hexValue(red: (255-redValue), green: (255-greenValue), blue: (255-blueValue))
comColorLabel.text = hexValue(red: (com - redValue), green: (com - greenValue), blue: (com - blueValue))
}
func hexValue(red: Int, green: Int, blue: Int) -> String {
var r: String = String(red, radix: 16)
if red < 16 {
r = "0" + r
}
r = r.uppercased()
var g: String = String(green, radix: 16)
if green < 16 {
g = "0" + g
}
g = g.uppercased()
var b: String = String(blue, radix: 16)
if blue < 16 {
b = "0" + b
}
b = b.uppercased()
return r + g + b
}
func makeColor(_ hex: String) {
let rgbArray = hex.splitInto(2)
redValue = Int(rgbArray[0], radix: 16)!
greenValue = Int(rgbArray[1], radix: 16)!
blueValue = Int(rgbArray[2], radix: 16)!
redSlider.value = Float(redValue)
greenSlider.value = Float(greenValue)
blueSlider.value = Float(blueValue)
toHex()
}
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
if textfield.text!.count != 6 {
textfield.text! = colorLabel.text!
let alert = UIAlertController(title: "Error", message: "6文字で入力してください", preferredStyle: .alert)
alert.addAction(
UIAlertAction(title: "OK",
style: .default,
handler: { action in })
)
present(alert, animated: true, completion: nil)
return true
} else {
var result = 0
for i in 0...5 {
result += Judgment(index: i)
}
if result != 0 {
textfield.text! = colorLabel.text!
let alert = UIAlertController(title: "Error", message: "その文字を使うことはできません。", preferredStyle: .alert)
alert.addAction(
UIAlertAction(title: "OK",
style: .default,
handler: { action in })
)
present(alert, animated: true, completion: nil)
return false
}
}
var rgbArray = textfield.text!.splitInto(2)
redValue = Int(rgbArray[0], radix: 16)!
greenValue = Int(rgbArray[1], radix: 16)!
blueValue = Int(rgbArray[2], radix: 16)!
redSlider.value = Float(redValue)
greenSlider.value = Float(greenValue)
blueSlider.value = Float(blueValue)
toHex()
textfield.resignFirstResponder()
return true
}
func Judgment(index: Int) -> Int {
let text = textfield.text!
let goot = ["0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f","A","B","C","D","E","F"]
let textArray = text.splitInto(1)
var result = 0
var y = 0
for i in 0..<goot.count {
if !(textArray[index].contains(goot[i])) {
y += 1
if y >= 22 {
result += 1
}
}
}
return result
}
func createView() {
textfield.font = UIFont.systemFont(ofSize: screenWidth/16.3043478)
colorLabel.font = UIFont.systemFont(ofSize: screenWidth/4.6875)
reverseColorLabel.font = UIFont.systemFont(ofSize: screenWidth/7.5)
comColorLabel.font = UIFont.systemFont(ofSize: screenWidth/7.5)
if screenWidth > 414 {
textfield.font = UIFont.systemFont(ofSize: (screenWidth/16.3043478)-7)
colorLabel.font = UIFont.systemFont(ofSize: (screenWidth/4.6875)-15)
reverseColorLabel.font = UIFont.systemFont(ofSize: (screenWidth/7.5)-5)
comColorLabel.font = UIFont.systemFont(ofSize: (screenWidth/7.5)-5)
}
colorLabel.frame = CGRect(x: screenWidth/16.3043478, y: screenHeight/9.44186047, width: screenWidth/1.13981763, height: screenHeight/9.12359551)
colorLabel.text = "FFFFFF"
colorLabel.textColor = UIColor.black
colorLabel.font = UIFont.systemFont(ofSize: screenWidth/4.6875)
colorLabel.textAlignment = .center
colorLabel.isUserInteractionEnabled = true
colorLabel.tag = 1
let longtapColorLabel = UILongPressGestureRecognizer()
longtapColorLabel.addTarget(self, action: #selector(self.copyColor))
longtapColorLabel.minimumPressDuration = 0.5
colorLabel.addGestureRecognizer(longtapColorLabel)
self.view.addSubview(colorLabel)
textfield.frame = CGRect(x: screenWidth/2.88461538, y: screenHeight/4.27368421, width: screenWidth/3.28947368, height: screenHeight/27.06666666)
textfield.borderStyle = .line
textfield.textAlignment = .center
textfield.delegate = self
textfield.text! = "FFFFFF"
textfield.clipsToBounds = true
textfield.keyboardType = .namePhonePad
self.view.addSubview(textfield)
reverseColorLabel.frame = CGRect(x: screenWidth/7.8125, y: screenHeight/2.75254237, width: screenWidth/1.34892086, height: screenHeight/11.2777777778)
reverseColorLabel.text = "000000"
reverseColorLabel.textColor = UIColor.white
reverseColorLabel.textAlignment = .center
reverseColorLabel.backgroundColor = UIColor.black
reverseColorLabel.layer.cornerRadius = 20
reverseColorLabel.clipsToBounds = true
reverseColorLabel.isUserInteractionEnabled = true
reverseColorLabel.tag = 1
let tapReverseColorLabel = UITapGestureRecognizer()
tapReverseColorLabel.addTarget(self, action: #selector(self.moveReverseColor))
reverseColorLabel.addGestureRecognizer(tapReverseColorLabel)
let longtapReverseColorLabel = UILongPressGestureRecognizer()
longtapReverseColorLabel.addTarget(self, action: #selector(self.copyComColor))
longtapReverseColorLabel.minimumPressDuration = 0.5
reverseColorLabel.addGestureRecognizer(longtapReverseColorLabel)
self.view.addSubview(reverseColorLabel)
comColorLabel.frame = CGRect(x:screenWidth/7.8125, y: screenHeight/2.00493827, width: screenWidth/1.34892086, height: screenHeight/11.27777777778)
comColorLabel.text = "FFFFFF"
comColorLabel.textColor = UIColor.black
comColorLabel.textAlignment = .center
comColorLabel.backgroundColor = UIColor.white
comColorLabel.layer.cornerRadius = 20
comColorLabel.clipsToBounds = true
comColorLabel.isUserInteractionEnabled = true
comColorLabel.tag = 1
let tapComColorLabel = UITapGestureRecognizer()
tapComColorLabel.addTarget(self, action: #selector(self.moveComColor))
comColorLabel.addGestureRecognizer(tapComColorLabel)
let longtapComColorLabel = UILongPressGestureRecognizer()
longtapComColorLabel.addTarget(self, action: #selector(self.copyReverseColor))
longtapComColorLabel.minimumPressDuration = 0.5
comColorLabel.addGestureRecognizer(longtapComColorLabel)
self.view.addSubview(comColorLabel)
redSlider.frame = CGRect(x: screenWidth/11.71875, y: screenHeight/1.38803419, width: screenWidth/1.20967742, height: 29)
redSlider.minimumValue = 0
redSlider.maximumValue = 255
redSlider.value = 255
redSlider.tintColor = UIColor.rgba(red: 255, green: 0, blue: 0, alpha: 1)
redSlider.isUserInteractionEnabled = true
redSlider.addTarget(self, action: #selector(self.redSliderChanged(_:)), for: UIControl.Event.valueChanged)
self.view.addSubview(redSlider)
greenSlider.frame = CGRect(x: screenWidth/11.71875, y: screenHeight/1.24923077, width: screenWidth/1.20967742, height: 29)
greenSlider.minimumValue = 0
greenSlider.maximumValue = 255
greenSlider.value = 255
greenSlider.tintColor = UIColor.rgba(red: 0, green: 255, blue: 0, alpha: 1)
greenSlider.isUserInteractionEnabled = true
greenSlider.addTarget(self, action: #selector(self.greenSliderChanged(_:)), for: UIControl.Event.valueChanged)
self.view.addSubview(greenSlider)
blueSlider.frame = CGRect(x: screenWidth/11.71875, y: screenHeight/1.13566434, width: screenWidth/1.20967742, height: 29)
blueSlider.minimumValue = 0
blueSlider.maximumValue = 255
blueSlider.value = 255
blueSlider.tintColor = UIColor.rgba(red: 0, green: 0, blue: 255, alpha: 1)
blueSlider.addTarget(self, action: #selector(self.blueSliderChanged(_:)), for: UIControl.Event.valueChanged)
self.view.addSubview(blueSlider)
}
}
extension String {
func splitInto(_ length: Int) -> [String] {
var str = self
for i in 0 ..< (str.count - 1) / max(length, 1) {
str.insert(",", at: str.index(str.startIndex, offsetBy: (i + 1) * max(length, 1) + i))
}
return str.components(separatedBy: ",")
}
}
extension UIColor {
class func rgba(red: Int, green: Int, blue: Int, alpha: CGFloat) -> UIColor{
return UIColor(red: CGFloat(red) / 255.0, green: CGFloat(green) / 255.0, blue: CGFloat(blue) / 255.0, alpha: alpha)
}
}
문제점
func createView()
100줄 사용당분간 언급하지 않겠다. 나는 문제점을 구체적으로 n개 부분으로 나누어 이야기하고 싶다.
이름이 불분명하다
나는 이것이 프로그래밍에서 초보자가 가장 범하기 쉬운 오류라고 생각하지만 전체적으로 변수 이름, 함수 이름의 명칭 규칙에 대해 일관성이 없다.일반적으로 변수명, 함수명의 명명 방법이 특수할 뿐이라면 이 규모의 프로젝트라면 한 사람이 앞부분을 쓰는 경우가 많기 때문에 가독성에 문제가 없다.(물론 좋은 코드는 아니지만) 이번 코드는 필자 본인도 2년 동안 썼는데 지금 읽기가 상당히 힘들다.실제로 두 번째로 읽으면 3개월이라도 읽기가 힘들다.다음은 실제 이 코드의 변수명, 함수명을 분별하기 어려운 부분과 일반적으로 반모드로 여겨지는 부분을 설명하고 싶습니다!!
생략된 변수 이름
안 좋은 부분.
var comColorLabel = UILabel()
왜 안 좋아
우선, 이 부분에는 comColorLabel이라는 변수가 있는데, 여러분은 이 응용 방법에 근거하여 이 변수의 작용을 추측할 수 있습니까?설마 많은 분들이
왜 추측할 수 없을까, 이 변수명
com
의 부분을 생략했기 때문이다.원래는complementary(Color와 함께 하면 영어로 보색한다는 뜻)라는 단어였는데, 그때는com에서 생략했어요. 타자가 너무 귀찮아서 그런 거 아니에요?"생략하면 뭐가 안 좋아요? 타자 범위가 좁아져서 효율적이죠?"그렇게 생각하는 사람이 있을지도 몰라요.골랑 같은 습관은'쉽게 추측할 수 있는 범위에 이 단어임을 확신할 수 있는 가장 짧은 변수명'을 붙이는 것인데, 확실히 생략해도 뜻이 전달된다면 저도 변수를 생략할 수 있다.
하지만 이번 코드라면'com'이라는 간략화된 문자에서 많은 단어를 추측할 수 있다.영어를 잘 못하는 나도 컴퍼니, 콤플렉스, 콤팩트 등의 단어를 추측해 낼 수 있다.이렇게 되면 추측이 되더라도 줄임말에서 원래 단어를 정할 수 없다.남들이 보면 힘들지...
어쩌면 좋아
이번엔 지금의 제말
complementaryColorLabel
이 조금 길겠지만 단어를 충분히 쓸 수 있을 것 같아요.방금 말한 바와 같이 나는 생략 명칭에 대해 부정하지 않지만 이번 경우complementary라는 단어는 일반적으로'보색'이라는 뜻이기 때문에 다음에 본 사람이 검색해도 주의를 끄는 명칭이 적당하다고 생각한다.반대로 유명하거나 인코딩에 많이 쓰이는 단어(info, id, auth) 등이라면 생략해도 뜻을 전달할 수 있기 때문에 괜찮다고 생각합니다.이것은 이번 코드와 조금 다르지만 이름이 가장 안 좋은 것은 label 1 label2처럼 무의미한 숫자(마술번호라고 부른다)를 사용하는 것이다. 이번 코드는 각 label이 다른 것을 전달하기 때문에 최소한의 선을 보장할 수 있다.매직넘버를 사용했다면 전선이 적힌 장본인이라도 정말 뭐가 뭔지 모르니까 그냥 포기해()
만약 정말 두 개의 명칭이 의미상의 차이가 없다면 앞쪽에서는 topLabel과bottomLabel 등이 표시하는 곳에서 변수 명칭을 바꾸면 상당히 이해하기 쉽다.
다중 사용 강제 잠금 해제
//TODO: description
View 생성 부분의 코드는 비직관적이다
//TODO: description
FatViewController
//TODO: description
고2는 이렇게 써요.
//TODO: description
... 하는 김에
만약 내가 지금 이 프로그램을 설치하기 시작한다면, 나는 이런 코드를 쓸 것이다.(창고 자체는 약 1년 전의 물건이지만 비교적 싸고 물건이 좋아서 직접 사용한다)
GitHub
RxSwift+MVM이 된 1년 전 매우 유행했던 구성.개인적으로view에서 논리를 완전히 벗어나view모델 이후의 층에 전체적으로 던질 수 있기 때문에 코드가 비교적 좋다고 생각합니다!
끝말
끝까지 읽어주셔서 감사합니다.
이번에 우리는 평소에 별로 하지 않는 일을 했다. 바로 중학교 2학년 때의 코드를 평론하는 것이다!
실제로 이 글을 쓰고서야 과거 자신의 실력을 대면하면서 현재 자신의 실력으로 수출하고, 평소 자신이 깨닫지 못했던 생각을 하면서 과거 자신과 비교되는 성장을 느낄 수 있는 좋은 기회라는 것을 알게 됐다.여러분도 2, 3년 전 자신의 코드를 꼭 보세요!!!!
Life is Tech!Members Advent Calendar 2020 3일째 벽돌 발송!!다음은 초강력 iOS Swift 엔지니어 Masashi가 Swift에 대한 글을 썼습니다!!기대된다...
Reference
이 문제에 관하여([WIP] 중학교 3학년 때 코드를 고2로 팩스), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/renren/articles/5333457c6b6153텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)