결론부터 말하자면
코딩테스트에서 정말 몇 줄도 코딩하지 못했다.
기존의 했던 테스트에서 요구사항에는 얼추 부합해보이지만, 세부 요구사항을 만족하지 못하는 요구사항이 있어 그 부분에 있어 다시 코딩을 하게 되었다.
여러가지 ROW를 리스트뷰에서 보여주는 일이였는데, 리싸이클로뷰로 만들껄.. 이라고 마음속으로 10번은 생각했던것 같다.
머리속에 혼란이 오니 처음 시작부터 삐딱선을 타기 시작했고, 추상클래스를 이용하여 ROW 리스트 타입 반환하는 함수를 만들어 내지 못했다. 이론으로만 배웠던 자바의 OOP 특성들을 잘 살리지 못했다. 기존의 방식을 살리려고 생각하다보니 더 어렵게 생각한거 같다.
(지금 생각해보니 한개의 레이아웃에 두개의 레이아웃을 인클루드 시켜서 visiablitiy로 하면 인플레이트의 비용을 줄여 괜찮은 방법이 되었을수도 있을것 같다 궁금증 x 100)
많이 부끄러웠다.
결국 몇줄 코딩으로 나의 실무 면접은 끝났다. 중간중간 왜 이런식으로 코딩을 하였는가에 대한 질문도 받았고 최대한 논리적으로 말하려고 노력했다.
집에 오니 내 자신에게 화가 나기도 하고, 너무나도 아쉬움이 남았다.(아쉬움 X 100)
그래서 도착하지마자 머리를 꽁꽁 싸매고 완성시켜서 메일로 첨부하여 보냈다.(거기서나 열심히 하지) 집에 1시30분에 도착했으니 한시간 정도 걸렸다.
그리고 커피를 마시며 후기 글을 적고 있다. 아직 전체적인 리팩토링이 남아있다. 레거시 코드도 걷어내야할것들이 좀 있고..
그래도 속은 좀 후련해졌다.
왜 아까는 생각나지 않았을까, 천천히 생각해보면 충분히 도출해냈을것 같은데 휴. 너무 당황하고 떨었던거 같다.
회사 분위기는 정말 좋아 보였다.
옷에서는 형형색색의 색깔이 보였으며, 반바지를 입은 분들도 보였다. 각자 음악을 들으며 작업 하던 모습이 얼마나 멋있어 보이던지 ㅋ.ㅋ
이제는 말할수 있다. 아, 나는 멍청한 개발자다! 하지만 성숙한 개발자로서 한걸음 도약을 하기위해 항해를 시작할꺼다.
*문제의 코드 부분. (이 부분을 해결하니 다른 부분에 있어서는 무난하게 해결되었다.)
으이구 이 멍충아
/**
* Created by kinamare on 2017-05-08.
*/
public abstract class MultiViewType {
public static final int TYPE_USERINFO = 1;
public static final int TYPE_GITREPOSITORY = 2;
public abstract int getType();
}
public class UserInfo extends MultiViewType implements Serializable{
@Override
public int getType() {
return MultiViewType.TYPE_USERINFO;
}
@SerializedName("login") public String mLogin; /*이하 생략*/ }
public class GitRepository extends MultiViewType implements Serializable {
@Override
public int getType() {
return MultiViewType.TYPE_GITREPOSITORY;
} @SerializedName("id") public Integer mId;/* 이하 생략*/
}
/*Activity Code, 필요 한것들을 초기화 해주고*/ private void initListView() {
gitRepoList = new ArrayList<>();
userInfoList = new ArrayList<>();
listViewType = new ArrayList<>();
listViewType.addAll(gitRepoList);
listViewType.addAll(userInfoList);
adapter = new RepoAdapter(this);
gitRepoLv.setAdapter(adapter);
}
/* 데이터를 가지고 와서 넣어주고 */ private void reqeustGitUserApi(String hostName) {
GithubServiceManager.getUserInfo(hostName)
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<Response<UserInfo>>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(Response<UserInfo> userInfoResponse) {
setUserInfoList(userInfoResponse.body());
}
});
}
private void setUserInfoList(UserInfo userInfo) {
this.userInfoList.add(userInfo);
adapter.setUserInfoType(userInfoList);
adapter.notifyDataSetChanged();
}
private void reqeustGitRepoApi(String hostName) {
GithubServiceManager.getRepoList(hostName)
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<Response<List<GitRepository>>>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
e.printStackTrace();
}
@Override
public void onNext(Response<List<GitRepository>> contributorResponse) {
gitRepoList = contributorResponse.body();
setGitRepoList(gitRepoList);
}
});
}
private void setGitRepoList(List<GitRepository> gitRepoList) {
adapter.setGitRepoType(descendingSort(gitRepoList));
adapter.notifyDataSetChanged();
}
/* 정렬도 시켜주고 */ public List<GitRepository> descendingSort(List<GitRepository> gitRepoList) {
Ascending ascending = new Ascending();
Collections.sort(gitRepoList,ascending);
return gitRepoList;
}
/* 아답터에서 이쁘게 그려주면 끝 , 이 RepoAdapter는 뷰의 재활용이 제대로 구현되어 있지 않고 코드도 깔끔하지 못하다. */ public class RepoAdapter extends BaseAdapter {
private Context context;
private List<MultiViewType> listViewType;
public RepoAdapter(Context context) {
this.context = context;
this.listViewType = new ArrayList<>();
}
@Override
public int getCount() {
return listViewType.size();
}
@Override
public Object getItem(int position) {
return listViewType.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder = null;
UserInfoHolder userInfoHolder = null;
int type = listViewType.get(position).getType();
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
switch (type) {
case MultiViewType.TYPE_USERINFO: {
convertView = inflater.inflate(R.layout.item_userinfo, null);
userInfoHolder = new UserInfoHolder(convertView);
convertView.setTag(userInfoHolder);
break;
}
case MultiViewType.TYPE_GITREPOSITORY: {
convertView = inflater.inflate(R.layout.item_git_repo, null);
viewHolder = new ViewHolder(convertView);
convertView.setTag(viewHolder);
break;
}
}
switch (type) {
case MultiViewType.TYPE_USERINFO: {
userInfoHolder.gitUserName.setText(((UserInfo) listViewType.get(position)).name);
Glide.with(context)
.load(((UserInfo) listViewType.get(position)).avatarUrl)
.override(150,150)
.placeholder(new ColorDrawable(this.context.getResources().getColor(R.color.black_7)))
.into(userInfoHolder.gitUserImage);
break;
}
case MultiViewType.TYPE_GITREPOSITORY: {
viewHolder.gitRepoNameTv.setText(((GitRepository) listViewType.get(position)).name);
viewHolder.gitRepoDescriptionTv.setText(((GitRepository) listViewType.get(position)).description);
viewHolder.gitRepoStarCntTv.setText(String.valueOf(((GitRepository) listViewType.get(position)).stargazersCount));
break;
}
}
return convertView;
}
public void setGitRepoType(List<GitRepository> items) {
listViewType.addAll(items);
}
public void setUserInfoType(List<UserInfo> items) {
listViewType.addAll(items);
}
public static class ViewHolder {
@BindView(R.id.gitRepoNameTv)
AppCompatTextView gitRepoNameTv;
@BindView(R.id.gitRepoDescriptionTv)
AppCompatTextView gitRepoDescriptionTv;
@BindView(R.id.gitRepoStarCntTv)
AppCompatTextView gitRepoStarCntTv;
public ViewHolder(View view) {
ButterKnife.bind(this, view);
}
}
public static class UserInfoHolder {
@BindView(R.id.gitUserImage)
AppCompatImageView gitUserImage;
@BindView(R.id.gitUserName)
AppCompatTextView gitUserName;
public UserInfoHolder(View view) {
ButterKnife.bind(this, view);
}
}
}
ServiceDefine, ServiceManager 등 많은 부분을 올리지 않았다 혹시나 소스가 필요하다면 말씀해주세요 (본인의 공부용도로만 사용해야합니다-)
:)
switch (type) {
case MultiViewType.TYPE_USERINFO: {
if (convertView == null || convertView.getTag() instanceof ViewHolder) {
convertView = inflater.inflate(R.layout.item_userinfo, null);
userInfoHolder = new UserInfoHolder(convertView);
convertView.setTag(userInfoHolder);
} else {
userInfoHolder = (UserInfoHolder) convertView.getTag();
}
break;
}
case MultiViewType.TYPE_GITREPOSITORY: {
if (convertView == null || convertView.getTag() instanceof UserInfoHolder) {
convertView = inflater.inflate(R.layout.item_git_repo, null);
viewHolder = new ViewHolder(convertView);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
break;
}
}
수정 되었다.
'Daily & Thinking' 카테고리의 다른 글
오랜만에 공부겸 알고리즘 테스트 (0) | 2019.04.14 |
---|---|
농협 핀테크 해커톤 100만원 획득! (0) | 2017.12.20 |
박근핵닷컴 해커톤 후기(대상 - 300만원) (0) | 2017.09.21 |
나만을 위한 봉사리스트 봉봉봉!(화려한 변신상 200만원) (0) | 2017.06.11 |
Roler 어플 소개 (0) | 2017.05.31 |